2013-03-27 70 views
1

我有一個MVC項目解決方案和一個單獨的Web Api項目。我一直在研究MVC部分,並將其作爲雲服務項目中的Web角色託管。在Azure的MVC項目中運行WebApi

現在我需要建立在Web Api上。在Azure模擬器中運行解決方案我無法打我的Web Api控制器,我得到一個404 Not Found。

在解決方案中創建WebApi項目之後需要執行哪些步驟才能使MVC項目與使用jQuery ajax調用(來自MVC項目)的Api控制器一起啓動?

注意:將消耗該API的應用程序的部分是在一個子域(例如「consumingapp.myapplication.com/api/Values」我不知道是否有什麼差別

+0

你的問題是非常相似的另一種我回答[這裏](http://stackoverflow.com/questions/12905566/web-api-in-mvc-solution-in-separate -project/12907799#12907799)。我想我的回答,也許在這個問題上的其他人應該幫助你。 – 2013-03-27 06:35:01

回答

0

。確定這裏是在一個單一的Web角色運行在Azure中端MVC和的WebAPI側的步驟:

  1. 僅添加MVC項目作爲雲服務項目中的Web角色
  2. 打開ServiceDefinition.csdef中一個配置如下:

    <Sites> 
        <Site name="Web" physicalDirectory="..\..\..\Application.Web"> 
         <Bindings> 
         <Binding name="Endpoint1" endpointName="Endpoint1" /> 
         </Bindings> 
        </Site> 
        <Site name="Web.Api" physicalDirectory="..\..\..\Application.Web.Api"> 
         <Bindings> 
         <Binding name="Endpoint1" endpointName="Endpoint1" hostHeader="api.myapplication.com"/> 
         </Bindings> 
        </Site>  
    </Sites> 
    

    注: 物理目錄是相對,所以你需要備份的軌道3個節點去解決方案文件夾部署到CloudProject \ BIN \發佈定義文件。另外我在嘗試運行項目時遇到了一些麻煩,它會自動將physicalDirectory切換回不良路徑。要修復我右鍵單擊雲項目>項目依賴關係>確保兩個項目都已關閉。還要確保保存並關閉定義文件的文本編輯器的所有實例,然後重新構建並最終運行。看起來像是某種讓我瘋狂並最終消失的缺陷。

  3. 配置您的主機文件,以允許本地測試使用模擬器:

    127.0.0.1 myapplication.com api.myapplication.com

  4. 要使用this .NET cors implementation您的WebAPI項目運行以下命令的NuGet :

    安裝,包裝Thinktecture.IdentityModel

  5. 下面的類(從後拍攝)添加到您的WebAPI項目:

    public static class CorsConfig 
    { 
        public static void RegisterCors(HttpConfiguration httpConfiguration) 
        { 
         WebApiCorsConfiguration corsConfig = new WebApiCorsConfiguration(); 
         corsConfig.RegisterGlobal(httpConfiguration); 
    
         corsConfig 
          .ForResources("Values") //Controller nae 
          .ForOrigins("http://myapplication.com", "myapplication.com:81") 
          .AllowAll(); 
        } 
    } 
    
  6. 呼叫RegisterCors()Application_Start()

  7. 確保您在的WebAPI項目有Web.config文件爲ExtensionlessUrlHandlerOPTIONS動詞:

    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    
  8. 做跨域請求打你api控制器:

    $.ajax({ url: "http://api.myapplication.com/api/Values", ... }) 
    

和中提琴!

希望幫助別人

+1

這是一個很好的寫法,與我所做的非常相似。你缺少的一件大事是你真的應該建立/發佈輔助站點,而不是依靠默認文件副本。這爲你提供了一個合適的軟件包(只包含你需要的文件)並啓用了配置轉換(關鍵)。請參閱http://kellyhpdx.wordpress.com/2012/04/11/deploying-multiple-web-applications-to-a-single-azure-instance-and-applying-web-config-transforms-correctly/以供參考。 – 2013-03-27 17:03:58

+0

是的,如果沒有那些額外的配置,我可能會在部署過程中遇到問題。感謝您獲取該鏈接。 – parliament 2013-03-27 20:01:24

+0

在我更改上面的工作配置之前,我想確定的唯一一件事:該設置是否仍然需要CORS?似乎兩個項目都部署到同一個域中,並且沒有執行hostHeader配置,因此實際上是否會使用$ .ajax({url:「/ api/Values」,..})訪問我的API? – parliament 2013-03-27 20:07:27