WCF 上的 CORS - 为啥在请求来自客户端机器时指定 Web 服务器?

Posted

技术标签:

【中文标题】WCF 上的 CORS - 为啥在请求来自客户端机器时指定 Web 服务器?【英文标题】:CORS on WCF - Why specify web server when request is from client machine?WCF 上的 CORS - 为什么在请求来自客户端机器时指定 Web 服务器? 【发布时间】:2016-07-10 17:48:42 【问题描述】:

为了允许对 WCF 服务的 HTTP GET 请求,我必须通过在 WCF 方法中执行此操作来允许 Web 服务器访问:

WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", webServer);

为什么会这样?请求来自客户端浏览器,而不是 Web 服务器。

加载页面 客户端 -- HTTP --> WebServer

提出 WCF 请求 客户端 -- HTTP --> WCF 服务

我使用 Wireshark 检查 WCF 服务器上的流量。它确实来自用户打开网页的客户端计算机。它不是来自网络服务器。那么,当流量不是来自 Web 服务器时,为什么在 Access-Control-Allow-Origin 中指定 Web 服务器会起作用?

如果有帮助,这就是 javascript 中的调用:

    var config = 
        url: 'http://WcfServerName:8000/MmaWebApiService/CreateCassette',
        method: 'POST',
        contentType: 'application/json; charset=utf-8',
        data:  'moduleSerialNumbers': [$scope.state.subId1, $scope.state.subId2, $scope.state.subId3] 
    ;

    $http(config)
        .then(function (response) 
            addCassetteToStack(response.data.d);
            $rootScope.setUserMessage('Cassette ' + response.data.d.SerialNumber + ' created.');
        , function (response) 
            console.log('err: ', response);
        );

【问题讨论】:

我不确定提供的代码中 webServer 的类型或属性是什么,所以我做了一些假设。通常,WCF 服务器是您的受保护资源,您应该在该级别允许或拒绝来自不同源域(例如您的 Web 服务器或 javascript 代码)的访问。即使您的 javascript 调用是在客户端进行的,请求标头也应该包含用于访问控制的源域。 啊,就是这样!我的请求标头将 Web 服务器显示为主机。谢谢!如果您想将其发布为答案,我会接受。 【参考方案1】:

我不确定提供的代码中 webServer 的类型或属性是什么,所以我做了一些假设。通常,WCF 服务器是您的受保护资源,您应该在该级别允许或拒绝来自不同源域(例如您的 Web 服务器或 javascript 代码)的访问。即使您的 javascript 调用是在客户端进行的,请求标头也应该包含用于访问控制的源域。

【讨论】:

以上是关于WCF 上的 CORS - 为啥在请求来自客户端机器时指定 Web 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?

在 WCF/WIF 中,如何合并来自两个不同客户端的自定义 sts 令牌的声明

突发请求时客户端上的 wcf 死锁

通过 HTTPS 上的客户端证书对 WCF 请求进行身份验证

WCF 上的一项服务、多个端点、多个绑定。为啥我无法到达我的端点?