3

WebHttp+HTTPS バインディングで実行されている自己ホスト WCF サービスに接続できません。さまざまな理由から、構成ファイルを使用するのではなく、サービス全体をコードで構成し、次の方法でサービスをインスタンス化します。

private ServiceHost CreateService()
{
    Type myServiceType = typeof(MyService);
    ServiceHost myService = new ServiceHost(myServiceType, new Uri(Constants.ServiceAddress));
    ContractDescription contract = ContractDescription.GetContract(myServiceType);

    WebHttpBinding httpsBinding = new WebHttpBinding(WebHttpSecurityMode.Transport);
    httpsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;

    ServiceEndpoint endpoint = myService.AddServiceEndpoint(myServiceType, httpsBinding, "MyService.svc");
    endpoint.Behaviors.Add(new WebHttpBehavior());

    ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
    metadataBehavior.HttpGetEnabled = true;
    metadataBehavior.HttpsGetEnabled = true;
    myService.Description.Behaviors.Add(metadataBehavior);

    myService.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, 
        StoreName.My, 
        X509FindType.FindByThumbprint, 
        Constants.CertThumbprint);

    return myService;
}

このコードを実行すると、サービスがインスタンス化され、エラーなしで開始されます。コードでクエリを実行すると、サービスは開いていると主張しnetstat、誰かが適切なポートでリッスンしていることを示します。このポートでの着信接続を許可するファイアウォールの例外があります。

ただし、ブラウザまたはクライアントでサービス エンドポイント アドレスを開こうとすると、すぐに接続に失敗します。理由はありますか?忘れていたサービス ホストまたは環境の構成はありますか?

編集

報告するエラー メッセージはありません。404、500、またはその他のエラーはありません。ブラウザは、ターゲット ポートへの接続を開くことができないかのように動作します。サーバーは着信接続を認識していないようです。

4

1 に答える 1

3

問題は、自分のポートに SSL 証明書を登録していなかったことです。次のコード行は機能しません。

myService.Credentials.ServiceCertificate.SetCertificate(
    StoreLocation.LocalMachine, 
    StoreName.My, 
    X509FindType.FindByThumbprint, 
    Constants.CertThumbprint);

サービス資格情報の設定は、クライアントに証明書認証を使用する場合にのみ関連します。HTTPS を使用している場合は、リッスンしているポートの SSL 証明書を登録する必要があります。次のコマンドを発行すると、問題が解決します。

netsh http add sslcert ipport=0.0.0.0:443 certhash=0b740a29f29f2cc795bf4f8730b83f303f26a6d5 appid={00112233-4455-6677-8899-AABBCCDDEEFF}

これを行うためのアンマネージド インターフェイスもありますが、マネージド ラッパーは存在しないため、netshプログラムを使用してこれを行うのが最も簡単です。

于 2013-01-31T18:04:36.473 に答える