2013-04-04 113 views
4

我知道這個問題已經在這個站點和其他站點上問了很多次,但是迄今爲止我沒有看到任何解決方案正在工作,所以我在這裏。Web服務器上的API Api調用返回404

我有一些web 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 web服務器,並在本地(Windows 7)中安裝IIS7的。 5,沒有花哨的東西,但在Server 2008 R2上的IIS7中運行時會產生404。

信息:

  • MVC4安裝在服務器上
  • 的應用與集成模式和框架v4中的應用程序池

我已經試過:

  • 與路線玩足以知道它不是路由問題
  • <modules runAllManagedModulesForAllRequests="true" />集(是默認反正)
  • 看着this
  • 完成的ASPNET_REGIIS -ir舞蹈
  • 自定義錯誤關閉,編譯調試=假的 - 如果這些任何區別。
  • 只有自定義API路線,沒有捕獲所有。
  • IIS日誌只是表示一個404,如你所料;沒有在系統事件日誌

API使用僅GETPOST請求,兩者都沒有工作。值得一提的是,這些調用都是通過ajax完成的。從配置

system.websystem.webServerruntime部分:

<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> 

任何建議非常感激。謝謝。

更新

我重新實現了我的一個控制器只使用HttpResponseMessageHttpRequestMessage

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

,這再次作品在本地運行時預期(包括卡西尼和完整的IIS本地Win7上安裝) ,但推送到服務器時失敗。

回答

0

無法解決此問題。幾乎可以肯定的是,在服務器上沒有安裝或打開一些晦澀的東西。非常令人沮喪的是其他Web Apis已經在同一個盒子上工作。

不能再花更多時間在它上面,所以只是使用Service Stack來代替,這只是起作用。

+0

嘿!你剛剛放棄了嗎?我有一個類似於你的問題。所有操作都可以使用,但是那些使用PUT和DELETE方法。我嘗試了所有的解決方案。但放棄不是我的選擇。 – 2013-06-10 16:17:43

+0

是的,我放棄並重新實現了服務堆棧 - 這是我更熟悉和滿意的事情。如果放置和刪除不起作用,它可能是防火牆相關的,看看這個:http://stackoverflow.com/questions/1828790/restful-put-and-delete-and-firewalls – 2013-06-10 16:42:03

+0

不,它沒有,即使在本地機器上也能工作。讓我瘋狂的是,同一個應用程序在IIS Express上運行。我卸載IIS,然後重新安裝它,並重新創建Web應用程序,它的工作!也許我的配置搞砸了。謝謝您的回覆。 – 2013-06-10 21:13:36

1

更新:我只注意到你說的GET方法也不起作用,在這種情況下,這個建議可能對你沒有用。

試着改變方法的簽名

[HttpPost] 
public HttpResponseMessage SaveAccount(HttpRequestMessage request) 
{ 

} 

這將允許你用行動選擇/模型綁定規則出了問題。如果它仍然不匹配,那麼我建議你打開跟蹤編寫器,找出它無法找到控制器的原因。 http://nuget.org/packages/Microsoft.AspNet.WebApi.Tracing/

如果它符合上面的簽名,那麼看看這篇博客文章http://www.bizcoder.com/?p=259以獲取關於如何調試序列化問題的進一步建議。

+0

感謝您的建議Darrel。我重新實現了一個控制器操作(一個GET操作)使用原始的HttpResponseMessage和HttpRequstMessage,並且,再次說明,在本地運行時,它可以完美工作,儘管代碼更多,但是當我將其推送到服務器時會發生可怕的炸彈。 。 – 2013-04-05 09:06:55