我已经设置了一个(.asmx种类的)Web服务,并且当我打开自定义错误处理时遇到了问题;一切正常,自定义错误关闭。当我打开它们并进行相同的Web服务调用时,我返回405状态,出现以下错误:
[HttpException (0x80004005): Request format is unrecognized.]
System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +489467
System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +212
System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated) +120
System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +346
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
我的网络服务声明如下,并且通过javascript作为POST http://xxx/WebServices/TestService.asmx/MyMethod调用,并且正文中包含param1 = xyz。
namespace Website.WebServices
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class TestService : System.Web.Services.WebService
{
[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public void MyMethod(string param1)
{
//...Do some important stuff
}
}
}
为了完整起见,我在Web.Config中的声明如下:
<system.webServer>
...
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1"/>
<error statusCode="404" path="/Error404.aspx" responseMode="ExecuteURL"/>
<remove statusCode="500" subStatusCode="-1"/>
<error statusCode="500" path="/Error.aspx" responseMode="ExecuteURL"/>
</httpErrors>
...
</system.webServer>
在Application_BeginRequest全局函数中执行此操作后,我可以看到一切正常 - 我只是看不出它可能出错的地方!我也直接访问了asmx文件并通过生成的表单提交并收到相同的错误。
这已在IIS7计算机上以及我的IIS express dev计算机上进行了测试,并且正在做同样的事情。
答案 0 :(得分:1)
通过将existingResponse
更改为Auto
来管理以解决此问题(感谢他回答Merk的回答Response.TrySkipIisCustomErrors not working)。
我对此的理解是,您有两种类型的错误响应; Replace
和PassThrough
。 PassThrough
准确地给出了.NET生成的内容(跳过IIS错误),Replace
用您在该代码中定义的内容替换响应。当我将其设置为Replace
时,它正在废弃我的WebService响应并将其替换为自定义的响应,由于runAllManagedModulesForAllRequests
标志设置为true,因此尝试重新运行webservice调用但没有请求体 - 因为缺少param1,因此原始错误为405。
希望这有助于其他人节省一天的调查费用!