Как вызвать простой сервис WCF, используя jQuery или простой js - PullRequest
5 голосов
/ 19 июля 2010

У меня очень простой сервис WCF hello world, как показано ниже.Когда я звоню через проект asp.net, добавляя ссылку на веб-сервис, он работает отлично.Но когда я вызываю его, используя jQuery или стандартный вызов js ajax (используя XMLHttpRequest), он вызывает функцию успеха, но возвращает нулевые данные.

Когда я пытался получить к нему доступ через браузер Firefox по этому адресу: http://localhost:8282/Test/TestService.svc/HelloWorld

Возвращено сообщение об ошибке с кодом «a: ActionNotSupported» и подробное описание ошибки как

Сообщение с действием '' не может быть обработано в получателе из-за несоответствия ContractFilter вEndpointDispatcher.Это может быть связано либо с несоответствием контракта (несоответствующие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем.Убедитесь, что отправитель и получатель имеют одинаковый контракт и одну и ту же привязку (включая требования безопасности, например, Message, Transport, None).

Если я изменяю привязку на 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>

Ответы [ 2 ]

5 голосов
/ 19 июля 2010

с кодом, указанным выше, сервис разрешает только запросы на мыло, поэтому для получения запросов HTTP мы должны изменить код, как указано ниже:

В интерфейсе:

    [WebGet(UriTemplate="helloworld")]
    [OperationContract]
    string HelloWorld();

в веб-конфигурации:

  • добавить поведениеConfiguration:

    <endpoint address="" binding="webHttpBinding" contract="radMLRPC.Test.ITestService" behaviorConfiguration="webBehav">
    
  • затем в поведении добавьте следующий тег:

    <поведение name = "webBehav"> </ поведение>

"удалите лишние пробелы сверху. Теги без лишних пробелов не отображались"


Проверьте некоторые ресурсы для этого:

Введение в RESTful-сервисы с WCF http: //msdn.microsoft.com/en-us/magazine/dd315413.aspx

Endpoint.TV скринкасты:

Endpoint.TV в целом действительно хорошо освещает REST WCF и WCF. http: //channel9.msdn.com/shows/Endpoint/

1 голос
/ 20 июля 2010

Использование веб-служб ASP.net, служб WCF и методов статической страницы из JavaScript (без MS AJAX)

Для webHttp и клиентского скрипта привязка mex не полезна. брось сейчас.

Личность может причинить вам горе, отбросьте ее сейчас.

У вас в качестве адреса HelloWorld, чтобы вызвать метод HelloWorld в вашем сервисе, вам нужно вызвать http://localhost:8282/Test/TestService.svc/HelloWorld/HelloWorld. drop.

<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> 

И посмотрим, сможем ли мы сделать ваш конфиг таким же образом, и мы рассмотрим некоторые тонкости настройки ваших входных и выходных форматов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...