如何根据架构自动选择传输?

时间:2012-12-25 08:30:11

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

不明白如何正确使用,所以,决定问。

有一些外部服务。这项服务有两个实现 - 具有传输安全性,没有。因此,有两个网址“http://example.com/service.asmx”和“https://example.com/service.asmx”。

我有应用程序,用户设置(使用GUI,而不是配置)连接的URL。所以,我用basicHttpBinding和endpoint创建了config。但问题是,如果我设置security =“Transport”,那么我的客户端无法使用http版本的服务,反之亦然。

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

1 个答案:

答案 0 :(得分: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;

endpoint.Address循环中的foreachUri,您可以将其与您感兴趣的匹配。

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