Mam relaksującego usługę WWW WCF z następującymi API:WebGet bez parametrów lub UriTemplate zawodzi
[WebGet(ResponseFormat = WebMessageFormat.Json)]
MyResponseContract GetFileInfo();
Kiedy próbuje uderzyć punkt końcowy (używając SoapUI) Widzę następujący komunikat o błędzie:
Serwer napotkał błąd podczas przetwarzania żądania. Proszę zobaczyć stronę pomocy serwisowej , aby skonstruować prawidłowe żądania do usługi.
Mam SOAPUI ustawiony na trafienie go za pomocą wywołania metody GET. Po przełączeniu go na test POST bez treści, kończy się niepowodzeniem z następującym komunikatem:
Metoda niedozwolona.
To ma sens: nie można trafić w GET za pomocą POST. Więc aktualizowane mój kod w następujący sposób:
[WebInvoke(ResponseFormat = WebMessageFormat.Json)]
MyResponseContract GetFileInfo();
A teraz wzywam go z SoapUI z metody POST i to działa. Ciekawy. Więc teraz zmienić swój kod w następujący sposób:
[WebInvoke(ResponseFormat = WebMessageFormat.Json, Method = "GET")]
MyResponseContract GetFileInfo();
Widziałem w kilku stanowisk, które jest w zasadzie odpowiednikiem atrybutu WebGet
. To też nie działa.
Moje pytanie brzmi: dlaczego to nie działa jako WebGet
, mimo że nie akceptuję parametrów lub używania niestandardowego UriTemplate?
adres URL staram się trafić go (jest obsługiwana lokalnie w IIS) wynosi:
http://localhost/Utilities/API/GetFileInfo
Aktualizacja Biorąc pod uwagę poniższe komentarze i odpowiedzi na pytania, ja wciąż do czynienia z ten problem. Kilka dodatkowych szczegółów.
My Web-warstwowa web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<customErrors mode="Off" />
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" maxReceivedMessageSize="10000000" />
</webHttpEndpoint>
</standardEndpoints>
<behaviors>
<endpointBehaviors>
<behavior name="exampleBehavior">
<callbackDebug includeExceptionDetailInFaults="true" />
<enableWebScript />
<webHttp helpEnabled="true" />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="WebHttpBinding" maxReceivedMessageSize="10000000" />
</webHttpBinding>
</bindings>
<client>
<endpoint address="http://LOCALHOST/Utilities.AppService/API"
binding="webHttpBinding" bindingConfiguration="WebHttpBinding"
contract="Utilities.Common.API.IMyApi"
behaviorConfiguration="exampleBehavior" />
</client>
</system.serviceModel>
</configuration>
Moja aplikacja dwuwarstwowa web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<customErrors mode="Off" />
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" maxReceivedMessageSize="10000000" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
</configuration>
Mój interfejs usługi
[ServiceContract(Namespace = "API")]
public interface IMyApi
{
[WebGet]
MyResponseContract GetFileInfo();
}
Moja implementacja web-warstwa
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyApiWebService : ClientBase<IMyApi>, IMyApi
{
public MyResponseContract GetFileInfo()
{
return Channel.GetFileInfo();
}
}
Moja implementacja aplikacji warstwy
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyApiAppService : IMyApi
{
public MyResponseContract GetFileInfo()
{
return new MyResponseContract();
}
}
My Web-warstwowa Global.asax:
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new ServiceRoute("API", new WebServiceHostFactory(), typeof(MyApiWebService)));
}
Moja aplikacja warstwy globalnej.asax:
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add(new ServiceRoute("API", new WebServiceHostFactory(), typeof(MyApiAppService)));
}
Nie jestem pewien, ile bardziej szczegółowo mogę zapewnić. Jak widać, biorąc pod uwagę dostarczone rozwiązania, zaimplementowałem wszystko, co zasugerowałem bezskutecznie. Niezależnie od tego, czy próbuję użyć tej metody WebGet
, umieszczając adres URL usługi warstwy sieci Web w przeglądarce, lub używając SOAPUI, lub próbując trafić ją testem jednostki C# za pomocą klienta usługi, nie mogę użyć WebGet
. Jeszcze raz dziękuję za twoją pomoc.
Co ciekawe, działa URL warstwy aplikacji. Ale warstwa internetowa nie. Więc:
localhost/Utilities.AppService/API/GetFileInfo
prace, natomiast
localhost/Utilities.WebService/API/GetFileInfo
nie.
Jak masz dostępu do niego - jak próbki URI? A żeby było jasne, ostatnia też nie działała? –
Zaktualizowane pytanie z wymaganymi szczegółami. –
Czy używasz 'WebHttpBinding'? –