提问



这不是一个问题 - 在此发布以供参考:


使用WebService时,出现以下错误:



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


最佳参考


在本网站上找到了解决方案[24]


您只需将以下内容添加到web.config中即可


<configuration>
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
    </webServices>
  </system.web>
</configuration>


来自微软的更多信息[25]

其它参考1


尽管我找到的所有信息中有90%(在尝试找到此错误的解决方案时)告诉我将HttpGetHttpPost添加到配置中,但这对我不起作用......反正对我来说没有意义。


我的应用程序运行在许多服务器(30+)上,我从来没有为其中任何一个添加此配置。无论是在.NET 2.0或.NET 4.0下运行的应用程序版本。


我的解决方案是针对IIS重新注册ASP.NET。


我用以下命令行来实现这个目的......


C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i

其它参考2


确保您使用正确的方法:发布/获取,正确的内容类型和正确的参数(数据)。


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

其它参考3


高超。


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


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


它在服务器中运行良好,因为直接调用Web服务函数 - 但是如果您在调试环境中直接从.Net运行服务并想要手动测试运行函数,则会失败。

其它参考4


为了记录,当我将旧应用程序从一台服务器移动到另一台服务器时,我收到了此错误。我将<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>


为什么没有这些线路在一个Web服务器上工作而不是另一个我不知道。

其它参考5


我使用以下代码行来解决这个问题。在web.config文件中编写以下代码


<configuration>
    <system.web.extensions>
       <scripting>
       <webServices>
       <jsonSerialization maxJsonLength="50000000"/>
      </webServices>
     </scripting>
   </system.web.extensions>
</configuration>

其它参考6


在localhost中开发时我没有遇到问题。但是,一旦我发布到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"
            });

其它参考7


在html中,你必须将调用包含在一个带有GET的表单中


<a href="/service/servicename.asmx/FunctionName/parameter=SomeValue">label</a>


您还可以使用POST将操作作为Web服务的位置,并通过输入标记输入参数。


还有SOAP和代理类。

其它参考8


在我的情况下,我有一个导致此异常的函数重载,一旦我更改了我的第二个函数的名称它运行正常,猜猜Web服务器不支持函数重载

其它参考9


我也用apache mod-mono得到了这个错误。看起来webservice的文档页面还没有在linux中实现。但是尽管出现这个错误,web服务仍在工作。您应该通过在url的末尾添加?WSDL来看到它,即http://localhost/WebService1.asmx?WSDL [26]

其它参考10


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


我们仍然不知道问题突然出现的原因。网络服务已经在HTTP和HTTPS上运行了5年。我们是唯一使用Web服务并且总是使用POST的人。


最近我们决定只使用托管Web服务SSL的站点。我们在Web.config中添加了重写规则,以便在常规GET和POST请求OPTIONS请求之上将任何HTTP转换为HTTPS,部署并立即开始获取。 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();
        }
    }

其它参考11


在我的情况下,当我从本地PC Windows 10移动到Windows 2012的专用服务器时发生错误。
解决方案是将以下行添加到web.config中


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

其它参考12


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


更改


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





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

其它参考13


一个需要ContextKey的WebMethod,


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


如果未设置此键,则获得异常。


通过分配AutoCompleteExtender的密钥来修复它。


ac.ContextKey = "myKey";