13

Windows サービスでホストされている WCF とサービス GUI の間で通信しようとしています。問題は、取得している OperationContract メソッドを実行しようとしているときです

「コントラクト「IContract」を持つ「net.tcp://localhost:7771/MyService」の ChannelDispatcher は、その IChannelListener を開くことができません。

私の app.conf は次のようになります。

<configuration>
<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="netTcpBinding">
                <security>
                    <transport protectionLevel="EncryptAndSign" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="MyServiceBehavior">
                <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:7772/MyService" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="MyServiceBehavior"
            name="MyService.Service">
            <endpoint address="net.tcp://localhost:7771/MyService" binding="netTcpBinding"
                bindingConfiguration="netTcpBinding" name="netTcp" contract="MyService.IContract" />
        </service>
    </services>
</system.serviceModel>

ポート 7771 はリッスンしており (netstat を使用してチェック)、svcutil は構成を生成できます。

任意の提案をいただければ幸いです。


例外からのスタック トレース

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter)
   at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

内部例外が 1 つあります (ただし、Exeption.InnerExeption の下ではなく、Exeption.Detail.InnerExeption の下に - ToString() メソッドでは表示されません)。

URI 'net.tcp://localhost:7771/MyService' の登録は既に存在します。

しかし、私のサービスは、この URI を app.config ファイルでのみ指定しています。ソリューション全体で、この URI はサーバーに 1 回、クライアントに 1 回出現します。

4

7 に答える 7

9

このタイプの例外では、問題の診断に役立つ情報を持つのは内部例外です。これはかなり一般的なエラーであり、さまざまな原因によって発生する可能性があります。

于 2010-04-08T03:51:25.633 に答える
5

私はそれを解決しました:D

問題の説明は次のとおりです。

最初の悪いコード:

namespace WCFServer
{
    public class Program : IWCFService
    {
        private ServiceHost host;

        static void Main(string[] args)
        {
            new Program();
        }

        public Program()
        {
            host = new ServiceHost(typeof(Program));

            host.Open();

            Console.WriteLine("Server Started!");

            Console.ReadKey();
        }

        #region IWCFService Members

        public int CheckHealth(int id)
        {
            return (1);
        }

        #endregion
    }
}

ご覧のとおり、サービス コントラクトはサービスをホストするクラスに実装されています。これにより、エラー全体が発生しました(おそらく typeof() がコンストラクターを実行します。この問題で建設的な入力を受け入れるかどうかはわかりません)。

良いコード:

namespace WCFServer
{
    public class Program
    {
        private ServiceHost host;

        static void Main(string[] args)
        {
            new Program();
        }

        public Program()
        {
            host = new ServiceHost(typeof(WCF));

            host.Open();

            Console.WriteLine("Server Started!");

            Console.ReadKey();
        }
    }

    public class WCF : IWCFService
    {

        #region IWCFService Members

        public int CheckHealth(int id)
        {
            return (1);
        }

        #endregion
    }
}

両方のファイルのサービス契約:

[ServiceContract]
public interface IWCFService
{
    [OperationContract]
    int CheckHealth(int id);
}

App.config

<configuration>
<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="WCFBehavior" />
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <netTcpBinding>
            <binding name="tcpBinding">
                <security>
                    <transport>
                        <extendedProtectionPolicy policyEnforcement="Never" />
                    </transport>
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <services>
        <service name="WCFServer.WCF">
            <endpoint address="net.tcp://localhost:1111/TcpIHostMonitor" binding="netTcpBinding"
                bindingConfiguration="tcpBinding" name="netTcpEndpoint" contract="WCFServer.IWCFService" />
        </service>
    </services>
</system.serviceModel>

于 2009-08-10T11:46:38.103 に答える
4

あなたがすでに問題を解決したことは知っていますが、なぜ問題が解決したのか、何がエラーの原因なのかを指摘する人は誰もいませんでした。最初のコードの問題は、プログラム (クラス Program) が、それ自体が「クラス Program」であるクラスへのオープン呼び出しを指定したことでした。つまり、それは再帰的です。リスナーを開けないというエラーが発生していたのも不思議ではありません! これは良いものでした!:-)

于 2016-09-12T05:57:05.153 に答える
1

ポートは、ウイルス対策プログラムなど、マシン上の別のプログラムによって既に使用されている可能性がありますか? または、Windows の予約済みポートです。ポートを 11111 などに設定してみていただけますか?

于 2009-08-10T10:02:23.430 に答える
0

設定のこの部分は無視されていると思います

<message clientCredentialType="UserName" />

設定するとき

<security mode = "Transport">
于 2010-11-11T03:09:22.353 に答える
0

OP と同じ理由でこの例外が発生しましたが、サービスの実装を新しいクラスに移動できませんでした。だから、私は別の解決策を見つけました。ServiceHostサービスのインスタンスを取る 2 番目のオーバーロードがあります。したがって、OPの「BAD」コードに適用される変更は次のとおりです。

namespace WCFServer
{
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] // required
    public class Program : IWCFService
    {
        private ServiceHost host;

        static void Main(string[] args)
        {
            new Program();
        }

        public Program()
        {
            host = new ServiceHost(this); // changed
            host.Open();

            Console.WriteLine("Server Started!");
            Console.ReadKey();
        }

        #region IWCFService Members

        public int CheckHealth(int id)
        {
            return (1);
        }

        #endregion
    }
}
于 2014-09-04T19:51:48.720 に答える