Почему мой контроллер вызывается дважды? - PullRequest
3 голосов
/ 11 августа 2011

Возможно, это что-то простое, но я просто не вижу этого.

У меня есть приложение, отправляющее данные на мой WebService (

var submitCommunicateCard = function () {
    console.log(rpc.views.Contact.CommunicateCard.getValues());
    Ext.Ajax.request({
        url: WebService('GetInTouch', 'CommunicateCard'), //http://webservice.example.com/GetInTouch/CommunicateCard
        method: 'post',
        params: {
            callback: 'foo', //temporary until I can better setup the callback.
            name: rpc.views.Contact.CommunicateCard.getValues().name,
            city: rpc.views.Contact.CommunicateCard.getValues().city
        }
    });
};

Поскольку мне нужно «помешать» моим проблемам межсайтового скриптинга, мне пришлось написать ActionFilter, который добавляет соответствующие заголовки.

namespace WebService.Attributes
{
    public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            HttpContext.Current.Response.Cache.SetNoStore();

            HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*");

            string rqstMethod = HttpContext.Current.Request.Headers["Access-Control-Request-Method"];
            if (rqstMethod == "OPTIONS" || rqstMethod == "POST")
            {
                HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Headers", "X-Requested-With, Accept, Access-Control-Allow-Origin");
            }
        }
    }
}

И в моем контроллере я получаю данные из своего приложения следующим образом.

    [AllowCrossSiteJsonAttribute]
    public JsonpResult CommunicateCard(CommunicateCardModel communicateCardModel)
    {
        CommunicateCardModel cc = null;
        string rqstMethod = System.Web.HttpContext.Current.Request.Headers["Access-Control-Request-Method"];
        if (rqstMethod != "POST")
        {
            // Do stuff with the model


             return this.Jsonp(true);
        }
        else { 
            return this.Jsonp(false); 
        }
    }

Вы увидите, что мне пришлось поставить if (rqstMethod != "POST"), потому что модель из "POST "пусто, но модель из" OPTIONS "- нет.

Здесь передаются необработанные заголовки ... (примечание: эти два заголовка передаются парами ... т.е. контроллервызывается дважды.)

ПЕРВЫЙ ВЫЗОВ

ОПЦИИ / GetInTouch / CommunicateCard HTTP / 1.1
Хост: webservice.example.com
Referer: http://192.168.3.138/
Метод контроля доступа-запроса: POST
Происхождение: http://192.168.3.138
Пользователь-агент: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit / 534.24 (KHTML,как Gecko) Chrome / 11.0.696.71 Safari / 534.24
Заголовки запроса-контроля доступа: X-Requested-With, Content-Type
Принимать: /
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US, en; q = 0,8
Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3

ВТОРОЙ ВЫЗОВ (обратите внимание на самую нижнюю строку, содержащую опубликованные данные (которая не содержится в первомвызов) callback=foo&name=Chester&city=Toronto)

POST / GetInTouch / CommunicateCard HTTP / 1.1
Хост: webservice.example.com
Ссылка: http://192.168.3.138/
Длина содержимого: 38
Происхождение: http://192.168.3.138
X-Requested-With: XMLHttpRequest
Пользовательский агент: Mozilla / 5.0 (Macintosh;Intel Mac OS X 10_7_0) AppleWebKit / 534.24 (KHTML, как Gecko) Chrome / 11.0.696.71 Safari / 534.24
Тип содержимого: application / x-www-form-urlencoded;charset = UTF-8
Accept: /
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US, en; q = 0,8
Accept-Кодировка: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3

обратный вызов = foo & name = Chester & city = Toronto

Есть ли способ предотвратить множественноезвонки на мой контроллер?(или почему мой контроллер вызывается дважды?)

1 Ответ

1 голос
/ 11 августа 2011

Оказывается, это было исправлено с помощью вызова JSONP из моего приложения Sencha Touch.
Ext.util.JSONP.request

// ЭТО НЕПРАВИЛЬНО, НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД, ЧТОБЫ СДЕЛАТЬ JSONP CALLS

var submitCommunicateCard = function () {
    console.log(rpc.views.Contact.CommunicateCard.getValues());
    Ext.Ajax.request({
        url: WebService('GetInTouch', 'CommunicateCard'), //http://webservice.example.com/GetInTouch/CommunicateCard
        method: 'post',
        params: {
            callback: 'foo', //temporary until I can better setup the callback.
            name: rpc.views.Contact.CommunicateCard.getValues().name,
            city: rpc.views.Contact.CommunicateCard.getValues().city
        }
    });

// ЭТО ПРАВО

var submitCommunicateCard = function () {
    console.log("Outbound Data Object:");
    console.log(rpc.views.Contact.CommunicateCard.getValues());
    Ext.util.JSONP.request({
        url: WebService('GetInTouch', 'CommunicateCard'),
        method: 'post',
        callbackKey: 'callback',

        params: {
            name: rpc.views.Contact.CommunicateCard.getValues().name,
            city: rpc.views.Contact.CommunicateCard.getValues().city
        },
        callback: function (result) {
            console.log("Inbound Data Object:");
            console.log(result);
            // Handle error logic
            if (result.success === true) {
                Ext.Msg.alert("Sent!", "Thank you, your message has been sent!", Ext.emptyFn);
                rpc.views.Contact.CommunicateCard.reset();
            } else {
                Ext.Msg.alert("Oops!", "looks like something went wrong, please try again.", Ext.emptyFn);
            }
        }
    });
};
...