无法识别网址格式意外终止的请求格式


283

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

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

无法识别以/ myMethodName结尾的URL的请求格式


4
为了使Google更加轻松,错误消息的德语翻译为“ URL无效,不加'/ _myMethodName'字尾。 ”。
Uwe Keim

以及中文翻译:“ 无法辨认要求格式,因为URL未预期地以/ myMethodName结束。
Ignatius

Answers:


515

此网站上找到了解决方案

您所需要做的就是将以下内容添加到您的web.config中

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

来自Microsoft的更多信息


3
我想,您要做的就是将<system.web>切换为<system.webserver>
roman m 2010年

我保持原样,现在错误似乎已经消失。如果我再次看到错误,我将把webservices配置移到webserver部分。
Daniel Brink

1
如果偶尔抛出此错误怎么办?这样的调用是否取决于某些客户端/浏览器配置!?
弗拉迪斯拉夫2013年

2
在带有IIS8的Win2012srv上,它是必需的。在带有IIS8的Win8上是不需要的。我所知道的配置中没有其他差异。
LosManos 2014年

1
@SaurabhRai我也是。这是做什么的?答案中提供的链接已断开。
Rod

18

尽管我发现了90%的所有信息(在尝试查找此错误的解决方案时)告诉我添加 HttpGetHttpPost到配置中,但这对我来说不起作用...而且对我来说还是没有任何意义。

我的应用程序在许多服务器(超过30台)上运行,而我从未为其中的任何服务器添加此配置。在.NET 2.0或.NET 4.0下运行的应用程序版本。

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

我使用以下命令行来实现这一目标...

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

这解决了我的问题。我遇到了与OP相同的错误;在以前工作的网站上。原来有人通过Windows功能(出于不相关的原因)启用了.NET 3.5,这破坏了我的网站。aspnet_regiis -i修复它。
Nate

16

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

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

1
我的参数值传递由于数据类型和缺少值而出现问题,最终导致500错误。现在解决了。
Pranesh Janarthanan

Add content-type: application/json也为我解决了这个问题。
Delphi.Boy,

10

高超。

情况2-在我的情况下可能会出现相同的问题),该问题是由于以下几行引起的:

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

它可以直接调用Web服务功能,因此在服务器中效果很好-但是,如果您在调试环境中直接从.Net运行服务,并且想要测试手动运行该功能,则会失败。


在web.config中添加了该逻辑,以防止浏览到.asmx服务时显示定义。显然,这破坏了ActiveReports。很高兴知道这可能是本地测试的症状,并且可以在服务器上运行。谢谢。
雅各布·巴恩斯

2

作为记录,当我将一个旧应用程序从一台服务器移到另一台服务器时,出现了此错误。我将<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服务器上没有这些行而没有其他我不知道的服务器行得通。


1

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

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

1

在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"
            });

1

我也用apache mod-mono遇到了这个错误。看来在Linux中尚未实现Web服务的文档页面。但是,尽管出现此错误,Web服务仍在运行。您应该通过?WSDL在URL末尾添加来查看它,即http://localhost/WebService1.asmx?WSDL


1

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

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

0

在html中,您必须以类似GET的形式将调用括起来,例如

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

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

也有SOAP和代理类。



0

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

我们仍然不知道为什么问题突然出现。该Web服务已经在HTTP和HTTPS上完美运行了5年。我们是唯一使用Web服务的服务,并且始终使用POST。

最近,我们决定将仅托管Web服务的站点设置为SSL。我们在Web.config中添加了重写规则,以将任何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();
        }
    }

0

直到我说(如下图所示的代码),我得到这个错误$ .holdReady(真)在我的Web服务调用和年初$ .holdReady(假)结束之后发生的。这是jQuery的事情,它挂起了页面的就绪状态,因此document.ready函数中的任何脚本都将等待此事件(还有其他可能但对我而言未知的事情)。

<span class="AjaxPlaceHolder"></span>
<script type="text/javascript">
$.holdReady(true);
function GetHTML(source, section){
    var divToBeWorkedOn = ".AjaxPlaceHolder";
    var webMethod = "../MyService.asmx/MyMethod";
    var parameters = "{'source':'" + source + "','section':'" + section + "'}";

    $.ajax({
        type: "POST",
        url: webMethod,
        data: parameters,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        xhrFields: {
            withCredentials: false
        },
        crossDomain: true,
        success: function(data) {
            $.holdReady(false);
            var myData = data.d;
            if (myData != null) {
                $(divToBeWorkedOn).prepend(myData.html);
            }
        },
        error: function(e){
            $.holdReady(false);
            $(divToBeWorkedOn).html("Unavailable");
        }
    });
}
GetHTML("external", "Staff Directory");
</script>

-1

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

更改

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

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

-1

需要ContextKey的WebMethod,

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

如果未设置此键,则会出现异常。

通过分配AutoCompleteExtender的键对其进行修复。

ac.ContextKey = "myKey";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.