Возможно, это что-то простое, но я просто не вижу этого.
У меня есть sencha-touch приложение, отправляющее данные на мой WebService ( asp.нетто-3 MVC *-1006 *).Код Sencha Touch js выглядит следующим образом.
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
Есть ли способ предотвратить множественноезвонки на мой контроллер?(или почему мой контроллер вызывается дважды?)