0

MiniCalcServiceオペレーションが1つしかない単純なWCFサービスに取り組んでいますAdd。クライアントとホストはどちらもコンソールアプリケーションです。クライアントアプリケーションは、各操作に必要なオペランドを受け取り、それらをサービスに渡します。このサービスは、クライアントコンソールに表示される結果を返します。

  • ホストが実行されています
  • 私はこれまですべてをコードで行っており、app.configはありません。
  • 渡される大きなデータはなく、2つまたは3つの数値だけが渡されます

これは昨日私のために働いた。今日、同じことを試したところ、次の例外がスローされます。

メッセージを受け入れることができるhttp:// localhost:8091/MiniCalcServiceをリッスンしているエンドポイントはありませんでした。

これがスタックトレースです。重要なことではありませんがMiniCalcClient、Visual StudioでMiniCalcService開発MiniCalcHostされ、SharpDevelopで開発されています。

MiniCalcHost

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), new Uri("http://localhost:8091/MiniCalcService")))
{
    host.AddServiceEndpoint(typeof(MiniCalcService.IService),new BasicHttpBinding(),"Service");

    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    host.Description.Behaviors.Add(smb);

    host.Open();
    Console.WriteLine("Serving MiniCalcService since {0}", DateTime.Now);
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . ");
    Console.ReadKey(true);
}

MiniCalcClient:

static string Calculator(string operation, params string[] strOperands)
{
    EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService");
    IService proxy = ChannelFactory<IService>.CreateChannel(new BasicHttpBinding(), ep);

    int[] operands;
    string result = string.Empty;

    try { operands = Array.ConvertAll(strOperands, int.Parse); }
    catch (ArgumentException) { throw; }

    switch (operation)
    {
        case "add":
            result = Convert.ToString(proxy.Add(operands));//<---EXCEPTION 
            break;
        default:
            Console.WriteLine("Why was this reachable again?");
            break;
    }

    return result;
}

サービス契約IService

[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService
{
    [OperationContract]
    double Add(params int[] operands);
}

この例外の原因を特定するのを手伝ってもらえますか?


解決策:この行を変更しました:

EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService");

これに:

EndpointAddress ep = new EndpointAddress("http://localhost:8091/MiniCalcService/Service");

そしてそれはうまくいった。

4

1 に答える 1

2

WCFサービス呼び出しでを使用できるかどうかはわかりませparamsん....とにかく、不要のようです...。

代わりに、これら2つのサービス契約を試して、それらが機能するかどうかを確認してください。

[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService2
{
    [OperationContract]
    int Add(int op1, int op2);
}

[ServiceContract(Namespace="learning.wcf.MiniCalc")]
public interface IService3
{
    [OperationContract]
    int Add(List<int> operands);
}

私はparamsあなたのサービス契約からを削除することでそれが実行されるのではないかと思っています-一見すべてがうまくいくようです...


さて、これは最初の試みではありませんでした.....。


まあ-非常に明白です、本当に:あなたはusingサービスホストのインスタンス化の周りにブロックを使用しています:

using(ServiceHost host = new ServiceHost(typeof(MiniCalcService.Service), new Uri("http://localhost:8091/MiniCalcService")))
{
    host.AddServiceEndpoint(typeof(MiniCalcService.IService),new BasicHttpBinding(),"Service");

    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    host.Description.Behaviors.Add(smb);

    host.Open();
    Console.WriteLine("Serving MiniCalcService since {0}", DateTime.Now);
    Console.Write("Press ENTER key to terminate the MiniCalcHost . . . ");
}

したがって、コードが閉じ括弧に到達するまでに}ServiceHostインスタンスは破棄され、サービスホストが閉じられます。実行中のサービスホストはもうありません!

たとえば、を呼び出した後、どこかでコードの実行を停止する必要があります。host.Open()

Console.ReadLine();

または、他の何か。

したがって、ホストが実行されているという最初の主張は、実際には持ちこたえられません。一時的に実行された後、すぐに再び終了します。

于 2012-03-26T20:31:24.260 に答える