2015-08-12 2 views
2

Я создал веб-службу (разновидности .asmx) и столкнулся с проблемой при включении пользовательской обработки ошибок; все отлично работает с отключенными пользовательскими ошибками. Когда я включаю их, и я делаю то же вызов веб-службы я получаю возвратило 405 статус с ниже ошибки:Пользовательские обработчики ошибок, бросающие 405 для asmx WebService

[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

Удалось решить эту проблему, изменив existingResponse на номер Auto (приложите к Мерку за его ответ Response.TrySkipIisCustomErrors not working).

Мое понимание состоит в том, что у вас есть два типа ответов для ошибок; Replace и PassThrough. PassThrough возвращает то, что генерирует .NET (пропускает ошибки IIS), а Replace заменяет ответ тем, что вы определили внутри этого кода. Поскольку у меня был установлен этот параметр на Replace, он отменил мой ответ WebService и заменил его на пользовательский, который из-за того, что флаг runAllManagedModulesForAllRequests установлен в true, попытался повторно запустить вызов webservice, но без тела запроса - следовательно, исходная ошибка из 405, поскольку param1 отсутствовал.

Надеюсь, это поможет кому-то еще сэкономить день на расследовании!

Смежные вопросы