对于意外结束的URL,无法识别请求格式

时间:2009-03-18 08:05:04

标签: asp.net web-services

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

当使用WebService时,我收到以下错误:

  

对于意外以 / myMethodName

结尾的网址无法识别请求格式

15 个答案:

答案 0 :(得分:485)

this website

上找到解决方案

您只需将以下内容添加到您的web.config

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

来自Microsoft的更多信息

答案 1 :(得分:17)

尽管我找到的所有信息中有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 :(得分:15)

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

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

答案 3 :(得分:9)

优异。

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

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

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

答案 4 :(得分: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服务器上工作,而另一个我不知道。

答案 5 :(得分:1)

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

UILabel

答案 6 :(得分:0)

在html中,您必须将调用包含在带有GET的表单中,如

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

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

还有SOAP和代理类。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

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

其余的应用程序运行良好。但由于这个问题,我们不断收到数百份错误报告。

有几篇帖子(例如this one)讨论了如何处理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 :(得分:0)

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

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

答案 12 :(得分:0)

在收到我的错误消息之前,我在Web服务调用的开头添加了 $。holdReady(true)(如下代码所示),并添加了 $。holdReady(false)。 。这是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>

答案 13 :(得分:-1)

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

变化

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

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

答案 14 :(得分:-1)

需要ContextKey的WebMethod,

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

未设置此键时,获得异常。

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

ac.ContextKey = "myKey";