如何使用json禁用Web安全性使用跨域请求?

时间:2015-06-12 05:25:44

标签: ajax json asp.net-mvc cross-domain jsonp

我有以下脚本进行REST / WCF WEBGET调用以返回有效负载。当AppServer和Web Server在同一个域中时,它可以正常工作。

用户界面Javascript:

model.Source = new kendo.data.DataSource({
    serverFiltering: true,
    pageSize: 5,
    type: 'GET',
    transport: {
        serverFiltering: true,
        serverPaging: true,
        serverGrouping: true,
        read: {
            dataType: "json",
            crossDomain: true,
            url: function () {
                $('#ShowLink').hide();
                var searchValue = $('#someBox')[0].value;
                return $("#SearchUrl").val() + '/' + searchValue;
            },
            error: function (e) {
                //some code
            },
            success: function (e) {
                //some code
            },
            complete: function (e) {
                //some code
            }
        }
    },
    schema: {
        parse: function (response) {
            if (response.length == 0) {
                //some code
            }
            return response;
        }
    }
});

Application Server(WCF)

    [WebGet(UriTemplate = "someresourceA/{id}/group/{searchText}",  
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json)]
    public IEnumerable<SomeDTO> SearchUrl(string id, string searchText)
    {
        var repository = _repositoryFactory.GetRepository<IRepo>();
        return repository.GetData(searchText, int.Parse(id));
    }

然而,当我做跨域请求时。 我收到以下错误

  

无法加载XMLHttpRequest   HTTP:///App.Query.Service/SomeService.svc/resource/1/...%5D%5Bfield%5D=displayText&滤波器%5Bfilters%5D%5B0%5D%5BignoreCase%5D =真。   否&#39;访问控制 - 允许 - 来源&#39;标题出现在请求的上   的资源。起源&#39; http://localhost&#39;因此不允许访问。

为了解决这个问题,我在chrome浏览器上执行了以下命令,并显示了结果。

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

正确显示数据并将预期结果返回给浏览器。

但是我不想在生产环境中这样做。用户将启用浏览器Web安全性。因此上述解决方案不起作用。

有些人可以指出我正确的方向来避免这种情况,还是有替代解决方案?

我也尝试过webServer / web.config选项但没有用。

<system.webServer>
<httpProtocol>
      <customHeaders>
               <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

任何想法都非常感激。

1 个答案:

答案 0 :(得分:1)

在您的Javascript ajax中,您需要对数据类型使用&#34; jsonp&#34; ,而不需要&#34; crossDomain:true,&#34;

read: {
     dataType: "jsonp",
     url: function () {
           $('#ShowLink').hide();
           var searchValue = $('#someBox')[0].value;
           return $("#SearchUrl").val() + '/' + searchValue;
     }

您需要修改&#34; App.Query.Service&#34; 项目中的 web.config 文件并添加以下标题:< / p>

<system.webServer>
  <httpProtocol>
    <customHeaders>      
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
  </httpProtocol>
  </system.webServer>

我遇到了这个问题,并且我也尝试过以下解决方案,但是通过以下解决方案,当我通过Fiddler监控时,我没有收到我的ajax Http响应中包含的标题(allow-origin)。

在WCF上进行1-CORS 实现:CustomHeaderMessageInspector:IDispatchMessageInspector 实现:EnableCrossOriginResourceSharingBehavior:BehaviorExtensionElement,IEndpointBehavior

根据此处的说明:http://enable-cors.org/server_wcf.html

2-在Global.ascx.cs中实现Application_BeginRequest()

希望它会有用。