Ошибка при доступе к веб-серверу ASP.net с использованием JQuery - JSONP - PullRequest
2 голосов
/ 11 марта 2009

Пожалуйста, посмотрите на приведенный ниже код и помогите мне понять, что я делаю неправильно в коде моего веб-сервиса. Я хочу настроить веб-сервис asp.net, который можно использовать с помощью JSONP. Я использую Jquery на стороне клиента для доступа к сайту. Даже после настройки правильных атрибутов мой веб-сервис по-прежнему генерирует xml, из-за чего не удается выполнить вызов aynch.

Веб-сервис

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {

    public WebService () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat= ResponseFormat.Json, XmlSerializeString=false, UseHttpGet=true)]
    public string HelloWorld(int id, string __callback) {
        return  __callback + "({message: 'Hello World'})";
    }

}

Ответ веб-службы:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">test({message: 'Hello World'})</string>

Web.Config:

<webServices>
    <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
    </protocols>
</webServices>
<httpHandlers>
    <remove verb="*" path="*.asmx"/>
    <add verb="*" path="*.asmx" validate="false" 
        type="System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version=3.5.0.0, 
            Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="*" path="*_AppService.axd" validate="false" 
        type="System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version=3.5.0.0, 
            Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="GET,HEAD" path="ScriptResource.axd" 
        type="System.Web.Handlers.ScriptResourceHandler, 
            System.Web.Extensions, Version=3.5.0.0, 
            Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
        validate="false"/>
</httpHandlers>
<httpModules>
    <add name="ScriptModule" 
        type="System.Web.Handlers.ScriptModule, System.Web.Extensions, 
            Version=3.5.0.0, Culture=neutral, 
            PublicKeyToken=31BF3856AD364E35"/>
</httpModules>

Javascript

$.ajax({
    type: "GET",
    contentType: "application/json; charset=utf-8",
    url: "http://localhost:54404/jsonp/webservice.asmx/HelloWorld?id=2&__callback=?", //?jsonp=MatchSvcCallback
    dataType: "jsonp",
    data: {},
    //jsonp : "MatchSvcCallback",
    success: function(msg) {
    alert("Inside success callback function"); // not being called

    },
    error: function(xhr, msg){
        var response = JSON.parse(xhr.responseText);

    }

});

Код js работает с обработчиком, но не работает для веб-службы из-за ответа xml.

1 Ответ

5 голосов
/ 11 марта 2009

Я думаю, что проблема здесь в том, что jQuery не устанавливает заголовок Content-Type в HTTP-запросе для HTTP GET при использовании $.ajax(). Он отправляется только в том случае, если тип запроса «POST». Похоже, это относится как к dataType: "jsonp", так и к dataType: "json".

.

Я попробовал ваш пример и наблюдал обмен запросами / ответами в Fiddler и, конечно же, я не вижу, чтобы Content-Type: application/xml; charset=UTF-8 отправлялся в заголовках для запросов HTTP GET. Заголовок действительно отправляется, если используется HTTP POST. Я предполагаю, что наличие этого заголовка является сигналом для сантехники веб-службы ASP.NET, чтобы решить, возвращать ли ответ в формате JSON или XML.

Кажется, вы не единственный, кто столкнулся с этой проблемой, см. Следующую статью на веб-сайте Elegant Code:

Вызов удаленных веб-служб ASP.NET из JQuery

Решение представляется одним из следующих:

  • Используйте HttpModule для добавления заголовка Content-Type: application/xml; charset=UTF-8 в поток запросов, как описано в статье выше.

  • Используйте HttpHandler для конечной точки, как вы объяснили, что делали до использования веб-службы ASP.NET.

  • Попробуйте подход Рика Страла на основе страниц в следующей статье (которая в любом случае HttpHandler): JSONP для обратных вызовов между сайтами .

...