Я знаю, что об этом много раз спрашивали на этом сайте и других, но ни одно решение, которое я видел до сих пор, не работает, так что я здесь.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 Есть
- Посмотрел this
- проделанная aspnet_regiis -IR танец
- Пользовательские ошибки выкл, компилировать отлаживать = False - если те, никакой разницы.
- Есть только пользовательские маршруты api, не улавливайте всех.
- Журналы IIS указывают только на 404, как и следовало ожидать; ничего в случае системы не входит
<modules runAllManagedModulesForAllRequests="true" />
набор (по умолчанию в любом случае)
АНИ использует только 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) , но сбой при нажатии на сервер.
Эй! Ты просто сдался? У меня проблема, похожая на вашу. Все действия работают, но с методами PUT и DELETE. Я пробовал все решения, как вы. Но отказ - это не вариант для меня. –
Да, я сдался и воспользовался Service Stack - это то, чем я знаком и доволен. Если put и delete не работают, это может быть связано с брандмауэром, посмотрите на это: http://stackoverflow.com/questions/1828790/restful-put-and-delete-and-firewalls –
Нет, t работать даже на локальной машине. Меня раздражало то, что одно и то же приложение работает на IIS Express. Затем я удалил IIS, а затем повторно установил его и заново создал веб-приложение, и оно сработало! Возможно, мои конфигурации были испорчены. Спасибо за ваш ответ. –