Answers:
在此网站上找到了解决方案
您所需要做的就是将以下内容添加到您的web.config中
<configuration>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</configuration>
来自Microsoft的更多信息
尽管我发现了90%的所有信息(在尝试查找此错误的解决方案时)告诉我添加 HttpGet
和HttpPost
到配置中,但这对我来说不起作用...而且对我来说还是没有任何意义。
我的应用程序在许多服务器(超过30台)上运行,而我从未为其中的任何服务器添加此配置。在.NET 2.0或.NET 4.0下运行的应用程序版本。
对我来说,解决方案是针对IIS重新注册ASP.NET。
我使用以下命令行来实现这一目标...
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
aspnet_regiis -i
修复它。
确保使用正确的方法:发布/获取,正确的内容类型和正确的参数(数据)。
$.ajax({
type: "POST",
url: "/ajax.asmx/GetNews",
data: "{Lang:'tr'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) { generateNews(msg); }
})
content-type: application/json
也为我解决了这个问题。
高超。
情况2-在我的情况下可能会出现相同的问题),该问题是由于以下几行引起的:
<webServices>
<protocols>
<remove name="Documentation"/>
</protocols>
</webServices>
它可以直接调用Web服务功能,因此在服务器中效果很好-但是,如果您在调试环境中直接从.Net运行服务,并且想要测试手动运行该功能,则会失败。
作为记录,当我将一个旧应用程序从一台服务器移到另一台服务器时,出现了此错误。我将<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服务器上没有这些行而没有其他我不知道的服务器行得通。
在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"
});
我也用apache mod-mono遇到了这个错误。看来在Linux中尚未实现Web服务的文档页面。但是,尽管出现此错误,Web服务仍在运行。您应该通过?WSDL
在URL末尾添加来查看它,即http://localhost/WebService1.asmx?WSDL
以我为例,当我从本地PC Windows 10迁移到Windows 2012专用服务器时,发生了错误。解决方案是将以下行添加到web.config中
<webServices>
<protocols>
<add name="Documentation"/>
</protocols>
</webServices>
就我而言,我有一个导致此异常的函数重载,一旦我更改了第二个函数的名称即可运行,请猜想Web服务器不支持函数重载
在我们的例子中,问题是由使用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();
}
}
直到我说(如下图所示的代码),我得到这个错误$ .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>