1

winforms アプリケーションで自己ホストされている WCF サービスがあります。次のリンクを使用しました。

WCF テスト クライアントを使用してサービスを追加しようとすると、次のエラーが表示されます: サービスの追加に失敗しました。サービス メタデータにアクセスできない場合があります。サービスが実行中で、メタデータを公開していることを確認してください。

エラーの詳細:

エラー: http://localhost:8001/HelloWorldからメタデータを取得できませんこれがアクセス権のある Windows (R) Communication Foundation サービスである場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。

メタデータの公開を有効にする方法については、MSDN のドキュメント ( http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:8001/HelloWorld ) を参照してください。

メタデータに解決できない参照が含まれています: 'http://localhost:8001/HelloWorld'。

メッセージを受け入れることができるhttp://localhost:8001/HelloWorldでリッスンしているエンドポイントはありませんでした。これは、多くの場合、アドレスまたは SOAP アクションが正しくないことが原因です。詳細については、InnerException (存在する場合) を参照してください。

リモート サーバーに接続できません ターゲット マシンがアクティブに拒否したため、接続できませんでした 127.0.0.1:8001HTTP GET エラー URI: http://localhost:8001/HelloWorld

「http://localhost:8001/HelloWorld」のダウンロード中にエラーが発生しました。

リモートサーバーに接続できません

ターゲット マシンがアクティブに拒否したため、接続できませんでした 127.0.0.1:8001

ここに私のコードがあります:

public Server()
{
    InitializeComponent();

    using (host = new ServiceHost(typeof(HelloWorldService), new Uri("http://localhost:8001/HelloWorld")))
    {
        // Check to see if the service host already has a ServiceMetadataBehavior
        ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
        // If not, add one
        if (smb == null)
            smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);

        //You need to add a metadata exchange (mex) endpoint to your service to get metadata.
        host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");

        //http
        host.AddServiceEndpoint(typeof(IHelloWorldService), new WSHttpBinding(), "");

        host.Open();
    }
}

[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    string SayHello(string name);
}

public class HelloWorldService : IHelloWorldService
{
    public string SayHello(string name)
    {
        return string.Format("Hello, {0}", name);
    }
}
4

3 に答える 3

1

理由はわかりませんが、using(){} を try{}..catch{} に切り替えると、このコードが正しく機能するようになります。WCF テスト クライアントはサービスを正常に追加でき、 http://localhost:8001/HelloWorld経由で実行中のサービスを参照できます。

于 2012-05-07T20:26:09.710 に答える
0

根本的な原因は一番下にあるようです:

リモート サーバーに接続できません ターゲット マシンがアクティブに拒否したため、接続できませんでした 127.0.0.1:8001

イベント ログをチェックして、host.Open() 呼び出しが失敗しているかどうか (おそらくファイアウォールか何かが原因) を確認するか、デバッガーでそれを調べてから、telnet を使用して実際に 8001 でリッスンしているかどうかを確認します。

于 2012-05-05T01:25:15.943 に答える
0

これが解決策です これを試してみてください

Uri baseAddress = new Uri("http://localhost:8001/HelloWorld");

    // Create the ServiceHost.
    using (serviceHost = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        serviceHost.Description.Behaviors.Add(smb);

        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        serviceHost.AddServiceEndpoint(typeof(IHelloWorldService), new WSHttpBinding(), "");
        serviceHost.Open();

    }
于 2012-05-17T11:51:12.657 に答える