当消费WebService时,我得到了以下错误:

URL意外以/myMethodName结尾,请求格式无法识别

如何解决这个问题?


当前回答

一个需要ContextKey的WebMethod,

[WebMethod]
public string[] GetValues(string prefixText, int count, string contextKey)

当此键未设置时,得到异常。

通过分配AutoCompleteExtender的键来修复它。

ac.ContextKey = "myKey";

其他回答

确保你使用了正确的方法:Post/Get,正确的内容类型和正确的参数(数据)。

$.ajax({
    type: "POST",
    url: "/ajax.asmx/GetNews",
    data: "{Lang:'tr'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) { generateNews(msg); }
})

在我们的例子中,问题是由使用OPTIONS请求方法(而不是GET或POST)调用web服务引起的。

我们仍然不知道为什么问题突然出现了。该web服务已经在HTTP和HTTPS上运行了5年。我们是唯一使用web服务的人,而且它总是使用POST。

最近,我们决定让网站只托管web服务SSL。我们向Web添加了重写规则。配置,将任何HTTP转换为HTTPS,部署,并立即开始获取,在常规的GET和POST请求之上,OPTIONS请求。OPTIONS请求导致了本文中讨论的错误。

应用程序的其余部分工作得非常好。但是由于这个问题,我们不断收到数百个错误报告。

有几篇文章(例如这篇)讨论了如何处理OPTIONS方法。我们直接在Global.asax中处理OPTIONS请求。这使问题消失了。

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var req = HttpContext.Current.Request;
        var resp = HttpContext.Current.Response;

        if (req.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            resp.AddHeader("Access-Control-Allow-Methods", "GET, POST");
            resp.AddHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, SOAPAction");
            resp.AddHeader("Access-Control-Max-Age", "1728000");
            resp.End();
        }
    }

确保您禁用了自定义错误。这可以掩盖代码中的原始问题:

改变

<customErrors defaultRedirect="~/Error" mode="On">

to

<customErrors defaultRedirect="~/Error" mode="Off">

我在本地主机开发时没有这个问题。然而,一旦我发布到一个web服务器,web服务返回一个空(空白)的结果,我看到我的日志中的错误。

我通过设置我的ajax contentType来修复它:

"application/json; charset=utf-8"

并使用:

JSON.stringify()

在我张贴的物体上。

var postData = {data: myData};
$.ajax({
                type: "POST",
                url: "../MyService.asmx/MyMethod",
                data: JSON.stringify(postData), 
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    console.log(data);
                },
                dataType: "json"
            });

一个需要ContextKey的WebMethod,

[WebMethod]
public string[] GetValues(string prefixText, int count, string contextKey)

当此键未设置时,得到异常。

通过分配AutoCompleteExtender的键来修复它。

ac.ContextKey = "myKey";