1

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

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

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

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

4

1 回答 1

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.Addressin that foreachloop 是一个Uri你可以匹配你感兴趣的那个。

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

于 2012-12-25T12:25:22.690 回答