Asp.net mvc 4 在Azure web中启用CORS

Asp.net mvc 4 在Azure web中启用CORS,asp.net-mvc-4,azure,cors,Asp.net Mvc 4,Azure,Cors,我试图做的是在从我的JavaScript调用https服务(不是我自己的)时为.net MVC 5 Azure网站启用CORS(跨源资源共享) 我总是犯同样的错误 无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”。响应的HTTP状态代码为400 我在本地开发时成功地启用了此功能,将我的项目设置为https,并将以下内容添加到web.config <system.webServer> <

我试图做的是在从我的JavaScript调用https服务(不是我自己的)时为.net MVC 5 Azure网站启用CORS(跨源资源共享)

我总是犯同样的错误

无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”。响应的HTTP状态代码为400

我在本地开发时成功地启用了此功能,将我的项目设置为https,并将以下内容添加到web.config

<system.webServer>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS"/>
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, SOAPAction"/>
    <add name="Access-Control-Max-Age" value="1728000"/>
  </customHeaders>
</httpProtocol>
</system.webServer>
有什么想法吗

编辑1

我只是想澄清一下

我正在调用一个我无法控制的服务,它是一个https服务,在我的javascript(不是控制器)中

编辑2

好的,我想我可以截取来自第三方服务的响应,并在浏览器拒绝它之前添加这个头。在我看来这是不可能的(对吧?)但是它为什么在本地工作呢

如果我捕捉到对该服务的调用,例如,我得到以下响应,其中没有“访问控制允许来源”限制(那么它在本地工作的方式是什么?)

请求(至)

答复:


WebApiConfig我将它设置为WebApiConfig类,它成功了。当我试图通过web.config设置Azurewebsites时,我也遇到了一些问题

在WebApiConfig中尝试以下操作:

   var cors = new EnableCorsAttribute("*", "*", "*");

   config.EnableCors(cors);

如果不想允许所有操作,可以编辑“”、“*”。

如果使用Owin,可以在Startup.cs文件中执行此操作:

app.UseCors(CorsOptions.AllowAll);
当且仅当您有意计划将API公开给所有源和头时才使用此选项

否则,您可以通过装饰控制器或特定方法来尝试这种方式:

 [EnableCors(origins: "http://someCallingService", headers: "*", methods: "*")]
不可能签出文章

它在本地工作,因为它是服务器,必须具有allow头,当您从javascript调用自己的Web服务器时,可以添加这些头

当您呼叫真实的网站时,他们可能不会添加CORS allow头(
访问控制允许源站
),因此您的请求被拒绝

您可以使用JSONP或通过自己的网站代理所有请求


例如,您可以使用我的CORS代理:。它的预期用途适用于IE9及以下版本,但对所有请求都同样适用。

我通过安装以下软件包解决了这一问题:

Microsoft.AspNet.WebApi.Cors
…然后如上所述使用Config.EnableCors()并更改我的web.Config转换:

在WebApiConfig.cs中:

    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.EnableCors();

        // Continue configuration as you wish... 
    }
然后,在web.config转换中,在我的示例中命名为web.PPE.config,因为它用于预生产:

<system.webServer>
    <httpProtocol>
        <!-- custom headers necessary for CORS -->
        <customHeaders xdt:Transform="Replace">
        <clear /> <!-- the clear here is important! -->
        <add name="Access-Control-Allow-Origin" value="http://url-that-is-allowed-to-communicate-with-this-server.com" />
        <!-- must match server DNS address or SignalR can't communicate with Hub remotely -->
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

YMMV决定是否包括允许凭据选项。我发现这对我的需要是必要的,那就是允许访问远程Azure Web服务器/应用程序实例上的信号器中心


祝你好运

谢谢你的评论。但服务不是我自己的(我更新了问题)。我直接用javascript打电话给一家国外服务公司。嘿,埃尔维斯,你能更具体地介绍一下你的解决方案吗?我们应该在哪里加上呢?我看到在azure中,您可以添加跨源资源共享以发出跨源请求,但我需要azure服务器将Access Control Allow Origin标头添加到响应中,但我无法将其变为真。我在名为WebApiConfig的App_Start文件夹中有一个类。它位于一个名为Register的方法中。公共静态无效寄存器(HttpConfiguration配置)。在web项目根目录下的Startup.cs中,有一个方法配置,即public void配置(IAppBuilder app)。在该方法中,我调用GlobalConfiguration.Configure(WebApiConfig.Register)从WebApiConfig类加载我的设置。答案与@elvisLives相同。是我在javascritp中调用外事服务。我希望我在这里没有完全倒退。但是它不应该在本地工作。。。大脑自由…好吧,我基本上有三个选择?1.JSONP 2。你的图书馆。或3。要求服务提供商将我的域添加到访问控制允许源站在配置中?我似乎把这件事完全颠倒了……是的,你理解得对。“我的服务器”是可选的,第二个选项实际上是通过自己的Web服务器或HTTP代理(其中“我的库”是备选方案之一)代理所有内容。
Microsoft.AspNet.WebApi.Cors
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.EnableCors();

        // Continue configuration as you wish... 
    }
<system.webServer>
    <httpProtocol>
        <!-- custom headers necessary for CORS -->
        <customHeaders xdt:Transform="Replace">
        <clear /> <!-- the clear here is important! -->
        <add name="Access-Control-Allow-Origin" value="http://url-that-is-allowed-to-communicate-with-this-server.com" />
        <!-- must match server DNS address or SignalR can't communicate with Hub remotely -->
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>
    </httpProtocol>
</system.webServer>