如何在禁用网络安全的情况下使用 json 跨域请求?

How to use cross domain requests using json with disable web security?

我有以下脚本可以对 return 有效载荷进行 REST/WCF WEBGET 调用。当 AppServer 和 Web Server 在同一个域中时,它工作得很好。

UI 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;
        }
    }
});

应用程序服务器 (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 cannot load http:///App.Query.Service/SomeService.svc/resource/1/…%5D%5Bfield%5D=displayText&filter%5Bfilters%5D%5B0%5D%5BignoreCase%5D=true. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.

为了修复,我在显示结果的 chrome 浏览器上执行了以下命令。

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

数据显示正确,预期结果return已发送到浏览器。

但是我不希望在生产环境中这样做。用户将启用浏览器网络安全。因此,上述解决方案行不通。

有人能给我指出正确的方向来避免这种情况吗?或者有其他解决方案吗?

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

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

非常感谢任何想法。

在你的 Javascript ajax 中你需要使用 "jsonp" 作为数据类型而不需要 "crossDomain: true,"

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

并且您需要修改 "App.Query.Service" 项目中的 web.config 文件并添加以下内容headers:

<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>

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

1- WCF 上的 CORS 实施:CustomHeaderMessageInspector:IDispatchMessageInspector 实施:EnableCrossOriginResourceSharingBehavior:BehaviorExtensionElement,IEndpointBehavior

根据此处的指示:http://enable-cors.org/server_wcf.html

2- 在 Global.ascx.cs

中实施 Application_BeginRequest()

希望有用。