【问题标题】:Running WebApi alongside MVC project in Azure在 Azure 中与 MVC 项目一起运行 WebApi
【发布时间】:2013-03-17 01:20:23
【问题描述】:

我有一个 MVC 项目和一个单独的 Web Api 项目的解决方案。我一直在研究 MVC 部分,并将其作为 Web 角色托管在云服务项目中。

现在我需要在 Web Api 上进行构建。在 azure 模拟器中按原样运行解决方案我无法访问我的 Web Api 控制器,我得到一个 404 Not Found。

在解决方案中创建 WebApi 项目后,我需要采取哪些步骤才能使我的 MVC 项目与它一起使用 jQuery ajax 调用(来自 MVC 项目)访问 Api 控制器?

注意:将使用 Api 的应用程序部分位于子域中(例如“使用应用程序.myapplication.com/api/Values”。我不知道这是否有任何区别。

【问题讨论】:

  • 您的问题与我回答的另一个问题非常相似 here。我认为我的回答以及该问题中的其他人可能会对您有所帮助。

标签: asp.net-mvc-4 azure asp.net-web-api


【解决方案1】:

好的,下面是在 Azure 中以单个 Web 角色并行运行 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>
    

    注意: 物理目录与部署到 CloudProject\bin\release 的定义文件相关,因此您需要回溯 3 个节点才能到达解决方案文件夹。此外,我在尝试运行项目时遇到了一些麻烦,它会自动将物理目录切换回错误的路径。为了解决这个问题,我右键单击了云项目 > 项目依赖项 > 确保两个项目都被选中。还要确保保存并关闭定义文件的文本编辑器的所有实例,然后重新构建,最后运行。似乎是某种让我发疯并最终消失的错误。

  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. Application_Start()拨打RegisterCors()

  7. 确保 WebApi 项目中的 Web.config 具有 OPTIONS 动词 ExtensionlessUrlHandler

      <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", ... })
    

还有维奥拉!

希望对他人有所帮助

【讨论】:

  • 这是一篇很好的文章,与我所做的非常相似。您缺少的重要一点是您确实应该构建/发布辅助站点,而不是依赖默认文件副本。这将为您提供适当的包(仅您需要的文件)并启用配置转换(关键)。参考kellyhpdx.wordpress.com/2012/04/11/…
  • 是的,如果没有那些额外的配置,我可能会在部署过程中遇到问题。感谢您返回该链接。
  • 如果您打算从 myapplication.com 调用 api.myapplication.com,则需要 CORS。这些不是同一个域。如果调用的是 myapplication.com/api,那么您将不需要 CORS。
  • 没有。您的路线图决定了您的应用程序的公开方式。
  • 正确,使用默认路由,您的 API 将通过 /api 显示,您不需要 CORS。如果您希望将 API 公开为 api.*,则需要 CORS。安全/身份验证要求可能会推动该决定。
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2022-11-28
  • 2019-10-17
  • 2019-09-01
相关资源
最近更新 更多