У меня есть очень простое привет мировой сервис WCF, как дали ниже. Когда я называю его с помощью проекта asp.net путем добавления ссылки веб-сервиса, это работает превосходное. Но когда я называю его с помощью jQuery или стандарта js ajax вызов (использование XMLHttpRequest
) это отзывает функцию успеха, но возвращает пустые данные.
Когда я пытался получить доступ к нему через браузер Firefox с помощью этого адреса: http://localhost:8282/Test/TestService.svc/HelloWorld
Это возвратило ошибку с кодом "a:ActionNotSupported" и детали ошибки как
Сообщение с Действием '' не может быть обработано в получателе, из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть из-за любого несоответствием контракта (Действия, которым не соответствуют, между отправителем и получателем) или несоответствием привязки/безопасности между отправителем и получателем. Проверьте, что отправитель и получатель имеют тот же контракт и ту же привязку (включая требования к защите, например, сообщение, Транспорт, Ни один).
Если я изменяю привязку к wsHttpBinding
затем это ничего не возвращает даже в Firefox.
Вот код:
Файл "Test/ITestService.svc":
[ServiceContract(Namespace = "http://localhost:8282/")]
public interface ITestService
{
[OperationContract]
string HelloWorld();
}
Файл "Test/TestService.svc":
public class TestService : ITestService
{
public string HelloWorld()
{
return "This is echo from server. Hello World";
}
}
Файл "web.config"
<system.serviceModel>
<services>
<service name="radMLRPC.Test.TestService" behaviorConfiguration="radMLRPC.Test.TestServiceBehavior"
<endpoint address="HelloWorld" binding="webHttpBinding" contract="radMLRPC.Test.ITestService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="radMLRPC.Test.TestServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
с кодом выше сервис разрешает только мыльные запросы, поэтому чтобы разрешить Get http запросы мы должны изменить код, как показано ниже:
[WebGet(UriTemplate="helloworld")]
[OperationContract]
string HelloWorld();
добавить behaviorConfiguration:
затем в поведении добавьте следующий тег:
< endpointBehaviors > < behavior name="webBehav" > < webHttp /> < /behavior > < /endpointBehaviors >
"пожалуйста, удалите лишние пробелы из вышеприведенного текста. он не показывает теги без лишних пробелов"
Посмотрите некоторые ресурсы для этого:
An Introduction To RESTful Services With WCF http: //msdn.microsoft.com/en-us/magazine/dd315413.aspx
Endpoint.TV screencasts:
Endpoint.TV в целом имеет действительно хорошее покрытие для WCF и WCF REST вещей. http: //channel9.msdn.com/shows/Endpoint/
Для webHttp и клиентского скрипта привязка mex бесполезна. оставь это сейчас.
Возможно, эта личность доставляет вам некоторое горе, оставьте пока что.
У вас есть адрес HelloWorld, чтобы вызвать метод HelloWorld в вашем сервисе, вам нужно будет вызвать http: // localhost: 8282 / Test / TestService.svc / HelloWorld / HelloWorld . брось это.
<services>
<service name="radMLRPC.Test.TestService" behaviorConfiguration="radMLRPC.Test.TestServiceBehavior"
<endpoint address="" binding="webHttpBinding" contract="radMLRPC.Test.ITestService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="radMLRPC.Test.TestServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
Теперь, когда может не довести вас до конца, но даст нам лучшую отправную точку. Я готов помочь вам решить эту проблему.
Сравните то, что у нас есть сейчас, с рабочим примером, показанным в связанной статье
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="AjaxEndpointBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ClientScriptServices.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ClientScriptServices.Service1Behavior" name="ClientScriptServices.Service1">
<endpoint behaviorConfiguration="AjaxEndpointBehavior" binding="webHttpBinding" contract="ClientScriptServices.Service1" />
</service>
</services>
</system.serviceModel>
И посмотрите, сможем ли мы придать вашей конфигурации аналогичную форму, и мы сможем охватить некоторые тонкости настройки ваших входных и выходных форматов .