尝试执行 cs WebMethod 时禁止跨域 AJAX POST 403

Posted

技术标签:

【中文标题】尝试执行 cs WebMethod 时禁止跨域 AJAX POST 403【英文标题】:Cross Domain AJAX POST 403 forbidden when attempting to execute a cs WebMethod 【发布时间】:2012-12-25 07:54:34 【问题描述】:

请原谅我对 Web 开发术语的陌生。

我正在尝试执行以下 [WebMethod]:

public static void CreatePendingCaseFromChat(string userInputs)

    //Do a bunch of stuff here with the userInputs string

使用以下 AJAX(位于另一台服务器上):

$.ajax(    type: "POST", 
            url: "http://www.MyCoolWebDomain.com/Code/MyCode.aspx/CreatePendingCaseFromChat",
            crossDomain: true,
            data: JSON.stringify(parameters), 
            contentType: "application/json; charset=utf-8", 
            dataType: "json",
            success: function (data)alert("success in ajax call"), 
            error: function (data)alert("error in ajax call")
        );

MyCode.aspx 在 Page_Load() 方法中包含以下几行:

Response.AppendHeader("Access-Control-Allow-Origin", "*"); //Allow Cross domain AJAX call, update the "*" to be a specific URL
Response.AppendHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
Response.AppendHeader("Access-Control-Allow-Headers", "content-type, x-requested-with");

如果我执行以下操作,而不是 ajax 调用:

var invocation = new XMLHttpRequest();
var url = "http://www.MyCoolWebDomain.com/Code/MyCode.aspx/CreatePendingCaseFromChat"
if (invocation) 
    invocation.open('POST', url, false);
    invocation.send();
    
else 
    alert("no invocation");

然后我可以通过 FireBug 确认设置了以下响应标头:

Access-Control-Allow-Head...    content-type, x-requested-with
Access-Control-Allow-Meth...    GET, POST, OPTIONS
Access-Control-Allow-Orig...    *

使用 AJAX 调用,这些标头都不会显示。

无论是使用 AJAX 调用,还是使用 XHR 调用,我都希望以任何一种方式进行这项工作。

对于 XHR 调用,我不知道如何将 userInputs 字符串发送到 WebMethod。 对于 AJAX 调用,我无法通过预检或调用它(OPTIONS 调用)。

【问题讨论】:

从包含它的页面中显示 cs 方法上的装饰器。 - 你需要使用 jsonp methinks @Mark Schultheiss 这就是我的菜鸟进来的地方。我如何展示装饰器;装饰师是什么?另外,我尝试了 JSONP,但它只适用于“GET”,并且我假设(可能不正确)因为我想将字符串传递给我的 WebMethod,我需要使用“POST”? 对于 JSON 我很确定你需要 [ScriptService] 和 [ScriptMethod] 装饰器 您看到 OPTIONS 请求在 FireBug 中发出了吗?如果是这样,您需要在服务层上使用 200 和您在上面指定的 Access-Control-Allow 标头响应 OPTION 请求。 这是您肯定需要的装饰器的一个示例:[WebMethod] 【参考方案1】:

我已经发布了一堆关于问题的代码:

CORS - Ajax error function reports error code as 0 for an API request returning 401

它正在使用 MVC4,但应该为您提供使其正常工作所需的一切。

【讨论】:

以上是关于尝试执行 cs WebMethod 时禁止跨域 AJAX POST 403的主要内容,如果未能解决你的问题,请参考以下文章

WCF REST 服务模板 40(CS) 跨域错误

asp.net framework 4.5 中的 ashx、asmx、axd + cs(handler)、webmethod(in aspx) 和 async 方法有啥区别? [关闭]

使用 WebMethod 返回带有 Message 的警报框

[WebMethod]的使用,ajax调用[WebMethod]的使用,webservice(web服务) asmx的使用,ajax调用[WebMethod]进行json传输

如何使用 AJAX (jquery) 将嵌套的对象数组传递和接收到 c# WebMethod 中?

如何在 UserControl (.ascx) 中调用 ASP.NET WebMethod