在 .NET Framework 4.8.1 上以 HTTP GET 模式获取 WCF 元数据时,应配置更早的元数据请求,而不只是最终的 SOAP 客户端。其受保护的 GetWebRequest 钩子可以应用单独管理的路由:

class RoutedMetadataClient : MetadataExchangeClient
{
    private readonly IWebProxy route;

    public RoutedMetadataClient(IWebProxy route)
    {
        this.route = route;
    }

    protected override HttpWebRequest GetWebRequest(
        Uri location, string dialect, string identifier)
    {
        HttpWebRequest request =
            base.GetWebRequest(location, dialect, identifier);
        request.Proxy = route;
        return request;
    }
}

这些类型来自 System.Net 和 System.ServiceModel.Description。使用预期的 WebProxy 构造此客户端,并为 WSDL URL 使用 HttpGet 模式。将代理账户放在该对象上;元数据服务器身份验证是独立的。

如果根 WSDL 成功但后续解析失败,请跟随导入。其他 WSDL 和架构可能使用不同的主机或协议。

为另一种获取模式选择相应的扩展。WS-MetadataExchange 使用通道,其创建钩子是 GetChannelFactory;它的绑定和代理设置不会普遍被 HttpWebRequest 替代方案替换。

当所有参与的旧版组件都应共享同一个代理时,默认的应用程序代理可能就足够了。子类用于在该 API 家族中显式拥有元数据。生成的 SOAP 调用仍需要自身的运行时传输配置。对于 BasicHttpBinding 客户端,请同时检查 ProxyAddress 和 UseDefaultWebProxy。

相关文章