不明白如何正确使用,所以,决定问。
有一些外部服务。这项服务有两个实现 - 具有传输安全性,没有。因此,有两个网址“http://example.com/service.asmx”和“https://example.com/service.asmx”。
我有应用程序,用户设置(使用GUI,而不是配置)连接的URL。所以,我用basicHttpBinding和endpoint创建了config。但问题是,如果我设置security =“Transport”,那么我的客户端无法使用http版本的服务,反之亦然。
那么,解决这个问题的最佳方法是什么?我应该分析用户设置的url架构,并根据它来以编程方式更改绑定安全性吗?
答案 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.Services
和System.ServiceModel
:
using System.Net;
using System.ServiceModel;
using System.ServiceModel.Description;
using WS = System.Web.Services.Description;
endpoint.Address
循环中的foreach
是Uri
,您可以将其与您感兴趣的匹配。
如果您只对http或https感兴趣,那么您也可以查看架构。