1

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

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

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

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

4

1 回答 1

0

好的,以下是在 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. 要使用此 .NET cors 实现,请在您的 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 具有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", ... })
    

还有维奥拉!

希望对其他人有所帮助

于 2013-03-27T07:57:41.933 回答