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

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

如何解决这个问题?


当前回答

极好的。

情况2 -同样的问题可以出现)在我的情况下,问题是由于以下一行:

<webServices>
  <protocols>
    <remove name="Documentation"/>
  </protocols>
</webServices>

它在服务器上工作得很好,因为直接调用webservice函数——但是如果你在调试环境中直接从。net运行服务,并且想要手动测试运行该函数,则会失败。

其他回答

在我们的例子中,问题是由使用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();
        }
    }

极好的。

情况2 -同样的问题可以出现)在我的情况下,问题是由于以下一行:

<webServices>
  <protocols>
    <remove name="Documentation"/>
  </protocols>
</webServices>

它在服务器上工作得很好,因为直接调用webservice函数——但是如果你在调试环境中直接从。net运行服务,并且想要手动测试运行该函数,则会失败。

确保你使用了正确的方法: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); }
})

为了记录,当我将一个旧应用程序从一个服务器移动到另一个服务器时,我得到了这个错误。我添加了<add name="HttpGet"/> <add name="HttpPost"/>元素到web。Config,它将错误更改为:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at BitMeter2.DataBuffer.incrementCurrent(Int64 val)
   at BitMeter2.DataBuffer.WindOn(Int64 count, Int64 amount)
   at BitMeter2.DataHistory.windOnBuffer(DataBuffer buffer, Int64 totalAmount, Int32 increments)
   at BitMeter2.DataHistory.NewData(Int64 downloadValue, Int64 uploadValue)
   at BitMeter2.frmMain.tickProcessing(Boolean fromTimerEvent)

为了修复这个错误,我必须添加ScriptHandlerFactory行到web.config:

  <system.webServer>
    <handlers>
      <remove name="ScriptHandlerFactory" />
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    </handlers>
  </system.webServer>

为什么在一个服务器上没有这些行,而在另一个服务器上没有,我不知道。

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

改变

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

to

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