【问题标题】:how to select transport automatically depending on schema?如何根据架构自动选择传输?
【发布时间】:2012-12-25 08:30:11
【问题描述】:

不明白如何正确制作,所以决定问一下。

有一些外部服务。该服务有两种实现方式 - 具有传输安全性和不具有传输安全性。所以,有两个网址“http://example.com/service.asmx”和“https://example.com/service.asmx”。

我有用户设置(使用 GUI,而不是配置)连接 url 的应用程序。因此,我使用 basicHttpBinding 和端点创建了配置。但是如果我设置 security="Transport" 那么我的客户端无法使用 http 版本的服务,反之亦然。

那么,解决这个问题的最佳方法是什么?我应该分析用户设置的 url 架构并根据它以编程方式更改绑定安全性吗?

【问题讨论】:

    标签: wcf wcf-binding wcf-security wcf-client


    【解决方案1】:

    您要查找的信息(要使用的绑定、传输和安全设置)包含在服务的元数据中。因此,如果您在服务上启用服务元数据,则可以下载 WSDL 并将其导入。

    例如,在 C# 客户端应用程序中,您可以使用 WsdlImporter.ImportAllEndpoints() 从服务元数据中读取端点配置,然后查找具有正确地址的端点配置:

    var wc = new WebClient();
    var metadata = new MetadataSet();
    using (var stream = wc.OpenRead("http://yourserver/YourService.svc?singleWsdl"))
    {
        var sd = WS.ServiceDescription.Read(stream);
        metadata.MetadataSections.Add(new MetadataSection("http://schemas.xmlsoap.org/wsdl/", "Test", sd));
    }
    var importer = new WsdlImporter(metadata);
    var endpoints = importer.ImportAllEndpoints();
    foreach (var endpoint in endpoints)
    {
        Console.WriteLine(endpoint.Address.Uri);
        var client = new MyServiceClient(endpoint.Binding, endpoint.Address);
        client.Hello();
    }
    

    你需要System.Web.ServicesSystem.ServiceModel

    using System.Net;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using WS = System.Web.Services.Description;
    

    foreach 循环中的endpoint.Address 是一个Uri,您可以将其与您感兴趣的那个进行匹配。

    如果您只对 http 或 https 感兴趣,那么您也可以只查看架构。

    【讨论】:

    • 我什么都不懂。我有 WCF 客户端。用户设置服务 url(我不知道这个 url 长什么样,我什至不知道服务的主机地址)。端点地址不在配置中设置,而是在 gui 中设置。然后呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多