Публикация JSON в веб-сервис ASP.NET (ASMX) только до ОПЦИИ и не полный POST - PullRequest
1 голос
/ 08 февраля 2012

Я работал над сценарием JQuery, который отправляет JSON в мой веб-сервис asp.net. Если сценарий находится в том же домене, он обрабатывается правильно, но когда я пытаюсь запустить сценарий из локального файла или из альтернативного домена, это, кажется, не происходит на глаз! .. Хотя я заметил, что в моем веб-журнале регистрируется Попытка достигнуть сервера, но с методом OPTIONS, а не POST.

Я попытался установить следующие заголовки в IIS, непосредственно в web.config и в моем файле global.asax для события application_beginRequest, но пока безуспешно!

Access-Control-Allow-Origin *

Методы контроля доступа-разрешения GET, POST.

Мой файл global.asax содержит:

protected void Application_BeginRequest(object sender, EventArgs e)
{

    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Cache.SetNoStore();

    EnableCrossDmainAjaxCall();
}

private void EnableCrossDmainAjaxCall()
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
                      "GET, POST, OPTIONS");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
                      "Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age",
                      "1728000");
        HttpContext.Current.Response.End();
    }
}

Мой клиентский скрипт выглядит следующим образом:

$.ajax({
            type: "POST",
            crossDomain: true,
            url: "http://myservice.mydomain.com/Data.asmx/Import",
            data: "{\"AppSession\":" + JSON.stringify(session) + "}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                // Insert the returned HTML into the <div>.
                $('#content').html(data.d);
            },
            error: function (j, t, e) {

                $('#content').html(e);
            }
        });

Мой код веб-службы выглядит следующим образом ...

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;

/// <summary>
/// Summary description for DataMgt
/// </summary>
[WebService(Namespace = "DataManagement")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService]

public class DataMgt : System.Web.Services.WebService {

    public DataMgt () {

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

    }
    public class GeoData
    {
        public string GEOLongitude { get; set; }
        public string GEOLatitude { get; set; }
        public string GEOAccuracy { get; set; }
        public string GEOStatusID { get; set; }
    }

    public class AppSession
    {
        public GeoData GEOData { get; set; }
        public string UserID { get; set; }
        public string CountryID { get; set; }
    }

    [WebMethod]

    public string ImportData(AppSession AppSession)
    {
        string strStatusCode;
        try
        {
            //Do stuff here with requested data

            strStatusCode = "SUCCESS";
        }
        catch (Exception ex)
        {
            strStatusCode = "FAILURE";
        }

        return strStatusCode;

    } 
}

Как я уже говорил ранее, это работает абсолютно нормально, когда клиентский скрипт выполняется в том же домене.

Сайт, на котором размещен мой сервис, работает на IIS 7 и ASP.NET 4.

Кто-нибудь подтверждал это при использовании аналогичной мне установки или кто-нибудь может подсказать, как решить эту проблему?

Заранее большое спасибо,

рит

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Если вы работаете в другом домене, вы не сможете отправить запрос POST на ваш сервер. Это ограничено, вы должны использовать JSONP

JSONP: http://api.jquery.com/jQuery.getJSON/

Учебное пособие: http://abstractform.wordpress.com/2009/10/12/accessing-remote-asp-net-web-services-using-jsonp/

0 голосов
/ 08 февраля 2012

Вам нужно использовать тип данных jsonp, а не json. Проверьте документы jQuery для метода ajax.

0 голосов
/ 08 февраля 2012

Не знаю, так ли это просто, но когда я пытаюсь сделать кросс-доменный вызов .ajax () с помощью jQuery, я должен добавить это к URL:

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