Вызов контракта через веб-браузер
Поскольку я новичок в WCF и настроил конечную точку службы WCF в IIS в виртуальном каталоге Api
(URL выглядит как http://localhost/api/taskapi.svc) я искал способы сделать запрос через веб-браузер что-то вроде http://localhost/api/taskapi.svc/GetCompleted
ответил бы JSON, который перечисляет все выполненные задачи, следовательно, эти два сообщения здесь дали мне несколько ответов
Хорошо, хм, так что я изменил свой OperationContract, как показано ниже
[OperationContract]
[WebGet(UriTemplate = "/GetCompleted", ResponseFormat = WebMessageFormat.Json)]
IList<Task> GetCompleted();
но все равно URL http://localhost/api/tasksapi.svc/GetCompleted
в браузере отвечает 400 Bad Request
,
Контракт на обслуживание
[ServiceContract]
public interface ITaskContract
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/task", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
TaskLibrary.Task CreateTask(TaskLibrary.Task myTask);
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/task", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
IList<TaskLibrary.Task> GetTasks();
[OperationContract]
[WebInvoke(Method = "DELETE", UriTemplate = "/task", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
bool DeleteTask(string taskId);
[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "/task", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
bool UpdateTask(TaskLibrary.Task myTask);
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/task/{taskId}", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
IList<TaskLibrary.Task> GetById(string taskId);
[OperationContract]
[WebInvoke(UriTemplate = "/task/completed", ResponseFormat = WebMessageFormat.Json, Method = "GET", RequestFormat = WebMessageFormat.Json)]
IList<TaskLibrary.Task> GetCompleted();
}
Сервис Конфиг
<system.serviceModel>
<services>
<service behaviorConfiguration="TaskApi.ServiceBehavior" name="TaskService.TaskService">
<endpoint address="" binding="wsHttpBinding" contract="TaskService.ITaskContract">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="TaskApi.ServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Справочная Директива
<%@ ServiceHost Language="C#" Debug="true" Service="TaskService.TaskService" %>
сервис выбирается из сборки, которая является выходной из библиотеки WCF Service
URL переписать, чтобы скрыть расширение SVC
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<rewrite>
<rules>
<rule name="Svc Extension remove pattern">
<match url="^([0-9a-zA-Z\-]+)/([0-9a-zA-Z\-\.\/\(\)]+)" />
<action type="Rewrite" url="{R:1}.svc/{R:2}" />
</rule>
</rules>
</rewrite>
</system.webServer>
- Что я должен сделать, чтобы сделать эту работу?
1 ответ
ОК, ваша привязка wsHttpBinding. Вам нужно изменить его на webHttpBinding (или добавить другую конечную точку). Затем вам нужно добавить endpointBehavior в разделе поведения следующим образом
<endpointBehavior>
<behavior name="rest">
<webHttp/>
</behavior>
</endpointBehavior>
Это поведение связывает функциональность для сопоставления Uris с методами. Затем вам нужно сослаться на это поведение из конечной точки webHttpBinding с помощью XML-атрибут поведения Configuration