1

作り方がよくわからないので、質問することにしました。

外部サービスもあります。このサービスには、トランスポート セキュリティを使用する場合と使用しない場合の 2 つの実装があります。したがって、「http://example.com/service.asmx」と「https://example.com/service.asmx」の 2 つの URL があります。

ユーザーが(構成ではなくGUIを使用して)接続用のURLを設定するアプリケーションがあります。そこで、basicHttpBinding と endpoint で構成を作成しました。しかし、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.ServicesものSystem.ServiceModel

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

そのループ内endpoint.Addressのは、関心のあるものと照合できる です。foreachUri

http または https のみに関心がある場合は、スキーマを確認することもできます。

于 2012-12-25T12:25:22.690 に答える