2013-03-27 36 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