自定义错误处理程序为asmx WebService抛出405

时间:2015-08-12 15:03:43

标签: c# .net web-services iis

我已经设置了一个(.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计算机上进行了测试,并且正在做同样的事情。

1 个答案:

答案 0 :(得分:1)

通过将existingResponse更改为Auto来管理以解决此问题(感谢他回答Merk的回答Response.TrySkipIisCustomErrors not working)。

我对此的理解是,您有两种类型的错误响应; ReplacePassThroughPassThrough准确地给出了.NET生成的内容(跳过IIS错误),Replace用您在该代码中定义的内容替换响应。当我将其设置为Replace时,它正在废弃我的WebService响应并将其替换为自定义的响应,由于runAllManagedModulesForAllRequests标志设置为true,因此尝试重新运行webservice调用但没有请求体 - 因为缺少param1,因此原始错误为405。

希望这有助于其他人节省一天的调查费用!