2013-04-04 8 views
4

Я знаю, что об этом много раз спрашивали на этом сайте и других, но ни одно решение, которое я видел до сих пор, не работает, так что я здесь.Web Api вызывает возврат 404 на сервере

У меня есть несколько веб-маршрутов api, созданных в проекте mvc 4. Вот пример:

routes.MapHttpRoute(name: null, routeTemplate: "Client/Accounts/Save", defaults: new { controller = "AccountsApi", action = "SaveAccount" }); 

, соответствующие следующим контроллера и действия:

public class AccountsApiController : ApiController 
{ 
    [HttpPost] 
    public object SaveAccount([FromBody] Account input) 
    { 
     ..... 

Это работает, когда работает во встроенном веб-сервере VS, и на локальном (Windows 7) установка IIS7. 5, без каких-либо причудливых действий, но дает 404 при работе в IIS7 на сервере 2008 R2.

Информация:

  • MVC4 установлен на сервере
  • Приложение находится в пуле приложений со встроенным режимом и рамочным v

Что я пробовал:

  • Играется с путями, чтобы знать, что это не проблема маршрутизации
  • 444 +42760359211350144688888 Есть <modules runAllManagedModulesForAllRequests="true" /> набор (по умолчанию в любом случае)
  • Посмотрел this
  • проделанная aspnet_regiis -IR танец
  • Пользовательские ошибки выкл, компилировать отлаживать = False - если те, никакой разницы.
  • Есть только пользовательские маршруты api, не улавливайте всех.
  • Журналы IIS указывают только на 404, как и следовало ожидать; ничего в случае системы не входит

АНИ использует только GET и POST запросы, ни один из которых работают. Также стоит упомянуть, что все звонки совершаются через ajax.

system.web, system.webServer, runtime секции от конфигурации:

<system.web> 
    <compilation debug="false" targetFramework="4.0" /> 
    <customErrors mode="Off" /> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login" timeout="2880" /> 
    </authentication> 
    <pages> 
     <namespaces> 
     <add namespace="System.Web.Helpers" /> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Optimization" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Web.WebPages" /> 
     </namespaces> 
    </pages> 
    </system.web> 

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 

Все предложения очень оценены. Благодарю.

Update

Я переопределен один из моих контроллеров использовать только HttpResponseMessage и HttpRequestMessage

[HttpGet] 
public HttpResponseMessage GetAccount(HttpRequestMessage message) 
{ 
    message.CreateResponse(.... 

и снова это работает, как ожидалось при работе на местном уровне (как Кассини и полный IIS локальная установка на Win7) , но сбой при нажатии на сервер.

ответ

0

Не удалось устранить эту проблему. Почти наверняка до какой-то неясной вещи, не установленной или включенной на сервере. Очень расстраивает, так как другие Web Apis уже работают в одной коробке.

Не мог потратить на это больше времени, поэтому вместо этого воспользуйтесь Service Stack, который просто работает.

+0

Эй! Ты просто сдался? У меня проблема, похожая на вашу. Все действия работают, но с методами PUT и DELETE. Я пробовал все решения, как вы. Но отказ - это не вариант для меня. –

+0

Да, я сдался и воспользовался Service Stack - это то, чем я знаком и доволен. Если put и delete не работают, это может быть связано с брандмауэром, посмотрите на это: http://stackoverflow.com/questions/1828790/restful-put-and-delete-and-firewalls –

+0

Нет, t работать даже на локальной машине. Меня раздражало то, что одно и то же приложение работает на IIS Express. Затем я удалил IIS, а затем повторно установил его и заново создал веб-приложение, и оно сработало! Возможно, мои конфигурации были испорчены. Спасибо за ваш ответ. –

1

Обновление: Я только заметил, что вы сказали, что методы GET также не работают, и в этом случае этот совет, вероятно, вам не подходит.

Попробуйте изменить подпись метода

[HttpPost] 
public HttpResponseMessage SaveAccount(HttpRequestMessage request) 
{ 

} 

Это позволит исключить проблемы с привязкой выбора действий/модели. Если он все еще не соответствует, я предлагаю вам включить автора трассировки и выяснить, почему он не находит контроллер. http://nuget.org/packages/Microsoft.AspNet.WebApi.Tracing/

Если это соответствует приведенной выше подписи, ознакомьтесь с этим сообщением в блоге http://www.bizcoder.com/?p=259, чтобы узнать, как отлаживать проблемы сериализации.

+0

Спасибо за предложение Даррел. Я повторно реализовал одно из действий контроллера (GET), чтобы использовать необработанные HttpResponseMessage и HttpRequstMessage, и, опять же, это работает отлично при работе на локальном компьютере, хотя и с большим количеством кода, но ужасно бомбит, когда я нажимаю его на сервер. –

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