Проблема при использовании службы REST WCF через вызов jquery ajax - PullRequest
1 голос
/ 14 ноября 2011

Я долго искал ответ (на SO тоже; я знаю, что это не совсем «свежий» вопрос), но я пока не нашел решения своей проблемы.У меня есть служба WCF REST, определенная следующим образом:

    [OperationContract]
    [WebInvoke(Method = "GET",
       ResponseFormat = WebMessageFormat.Json,
       BodyStyle = WebMessageBodyStyle.Bare,
       UriTemplate = "json/getUserOperations")]
Response<List<Operation>> GetUserOperations();

с этим web.config:

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="WS_REST.DataServiceBehavior">
                 <serviceMetadata httpGetEnabled="true" />
                 <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="web">
                <webHttp/>     
            </behavior>      
        </endpointBehaviors>
    </behaviors>    
    <services>
        <service behaviorConfiguration="WS_REST.DataServiceBehavior" name="WS_REST.DataService">
            <endpoint address="" binding="webHttpBinding" contract="WS_REST.IDataService" behaviorConfiguration="web">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </service>
    </services>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

Это хорошо работает, если вызывается из браузера.Но если я вызываю это в jquery ajax, как показано ниже:

$.ajax({
        url: "http://localhost:1996/DataService.svc/json/getUserOperations",
        type: "GET",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        processdata: true,
        success: processReceivedData,
        error: onError,
        complete: function () { alert('completed'); }

 });

, сервис возвращает мне сообщение «Метод 405 не разрешен».Это заголовки запроса и ответного сообщения:

    OPTIONS http://localhost:1996/DataService.svc/json/getUserOperations HTTP/1.1
    Host: localhost:1996
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Connection: keep-alive
    Origin: http://localhost:2100
    Access-Control-Request-Method: GET
    Access-Control-Request-Headers: content-type

    HTTP/1.1 405 Method Not Allowed
    Server: ASP.NET Development Server/9.0.0.0
    Date: Mon, 14 Nov 2011 16:28:58 GMT
    X-AspNet-Version: 2.0.50727
    Set-Cookie: ASP.NET_SessionId=0bd0cdyhwyvmuauqcbasvp45; path=/; HttpOnly
    Cache-Control: private
    Content-Type: text/html; charset=UTF-8
    Content-Length: 1024
    Connection: Close

Итак, я попал в this , обнаружив, что это может быть некоторой проблемой, связанной с междоменными вызовами, изатем я изменил свой OperationContract следующим образом:

    [OperationContract]
    [WebInvoke(Method = "*",
       ResponseFormat = WebMessageFormat.Json,
       BodyStyle = WebMessageBodyStyle.Bare,
       UriTemplate = "json/getUserOperations")]
Response<List<Operation>> GetUserOperations();

Таким образом, кажется, что запрос корректно обслуживается, как показывают заголовки:

    OPTIONS http://localhost:1996/DataService.svc/json/getUserOperations HTTP/1.1
    Host: localhost:1996
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Connection: keep-alive
    Origin: http://localhost:2100
    Access-Control-Request-Method: GET
    Access-Control-Request-Headers: content-type

    HTTP/1.1 200 OK
    Server: ASP.NET Development Server/9.0.0.0
    Date: Mon, 14 Nov 2011 16:45:19 GMT
    X-AspNet-Version: 2.0.50727
    Set-Cookie: ASP.NET_SessionId=as4tch55yulzc32fzxsefh2y; path=/; HttpOnly
    Cache-Control: private
    Content-Type: application/json; charset=utf-8
    Content-Length: 793
    Connection: Close

Ответное сообщение фактически содержит действительныйJSON данные, которые я запросил.Кстати, функция jquery.ajax все еще вызывает событие ошибки ... Я не понимаю, почему, поскольку ответ кажется правильным полученным.Кто-нибудь замечает что-то не так?

С уважением!

Ответы [ 3 ]

1 голос
/ 04 января 2012

Решение здесь: http://www.codeproject.com/KB/ajax/jQueryWCFRest.aspx

Я сделал, как объяснено в параграфе «Междоменная проблема», и все работает.

0 голосов
/ 15 ноября 2011

Для вызовов jquery ajax, я думаю, вам нужна следующая конфигурация поведения конечной точки:

<endpointBehaviors>
         <behavior name="web">
             <enableWebScript />
         </behavior>
</endpointBehaviors>
0 голосов
/ 14 ноября 2011

У меня была похожая проблема, когда я реализовывал свою службу WCF Rest, и похоже, что у вас было все, что у меня было, кроме:

[WebGet(UriTemplate = "/GuessWhat/{variable}", ResponseFormat = WebMessageFormat.Json)]

Я использую это вместо атрибута WebInvoke. Я использую WebInvoke, если хочу сделать сообщение HTTP.

Я не уверен, сработает ли это для вас, но это, похоже, решило мою проблему.

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