5

次のウォークスルーを使用して、Windows サービスでホストされる WCF ライブラリをセットアップしました。

http://msdn.microsoft.com/en-us/library/ff649818.aspx

コンシューマーの winforms は同じソリューション内にあり、職場の PC の C: ドライブにローカルに配置されています。

ウォークスルーは機能します。つまり、winforms ボタンで正しい答えが得られます。

単一の Windows フォーム プロジェクトを含む新しいソリューションを C ドライブに作成すると、service referenceこの実行中のサービスに正常に追加できず、次のメッセージが表示されます。

ここに画像の説明を入力

詳細メッセージには次のように記載されています。

URI プレフィックスが認識されません。メタデータに解決できない参照が含まれています: 'net.tcp://localhost:8526/Service1'。net.tcp://localhost:8526/Service1 に接続できませんでした。接続の試行は、00:00:02.0020000 の期間継続しました。TCP エラー コード 10061: ターゲット マシンがアクティブに拒否したため、接続できませんでした 127.0.0.1:8526。ターゲット マシンがアクティブに拒否したため、接続できませんでした 127.0.0.1:8526 現在のソリューションでサービスが定義されている場合は、ソリューションを構築して、サービス参照を再度追加してみてください。

このサービス参照をサービスと同じソリューション内のプロジェクトに追加できるのに、別のソリューション内のプロジェクトからは追加できないのはなぜですか?


編集

私の同僚が MSDN の記事でエラーを発見しました

4

2 に答える 2

12

The step by step walkthrough article at MSDN ends unfortunately where it gets interesting, so let's continue here. Because there are many possibilities which may cause the error, I've described several options (= scencarios which may cause the issue) below, which should help troubleshooting:

1st option: Try to specify

  net.tcp://localhost:8526/Service1/mex

when you add the service reference to your new client - ensure that the service is installed and running before you do that.

Explanation: The suffix "mex" stands for "metadata exchange" and allows Visual Studio to download details of the WCF contract. This suffix is also used in the walk-through example, it was added automatically (you will see it in the Address field if re-open the added service reference by right-clicking on "Configure Service-Reference...").


2nd option: What I noticed when I tested the walk-through is that it helps sometimes to right-click on the service reference and select in the contect menu "Update Service-Reference".

After a while in the systray you can see the balloon message "Your service(s) have been hosted.", after which you can start the client within the same solution. In this case, the service has been temporarily created but is not deployed permanently - which means, if you stop debugging, it is removed. As a result, you can't use this service from a remote PC, it is just visible within the solution in Visual Studio. Visual Studio internally invokes the tool

WcfSvcHost.Exe /Service:<Service1Binary> /Configuration:<Service1Config> 

supporting it with the right parameters to register the service properly (you can find this tool in Visual Studio's Common7\IDE subdirectory, and there is also WcfTestClient.Exe available - a tool which acts as a client, very useful to debug WCF).

For instance, if you have stopped debugging, and launch the client.exe from Windows Explorer outside of Visual Studio, then it does not find the service and you're getting exactly the error message you have described in your question.

There are two interesting links regarding this matter at Microsoft: Problem with Metadata Exchange and Publishing Metadata

Note that this is different from deploying it as described in the 3rd option.


3rd option: Have you used InstallUtil to deploy the service? In this case it can happen that you have accidently removed the [...]/bin/Debug subdirectory and the service fails to start, because the .EXE file is missing.

Note: This can be avoided if you're using a ServiceInstaller project, which copies the binaries before the service is registered. Or - if you want to use InstallUtil for simplicity - you can copy the service binaries to a target directory (including the .config files and .dlls) before you register it.


4th option: If you run the service on a remote computer, you need to specify the proper host name or IP address of the host instead of localhost, and you need to ensure that the personal firewall (windows firewall or 3rd party) doesn't block the port 8526 (the port number which was used in the example). Specify an exception to allow this port for incoming and outgoing traffic.


5th and final option (UPDATE): Naming conflict - Service1 is the service but also the class name in the Wcf library. Either fully qualify the class name you're using from the WCF library in the service, i.e. WcfServiceLibrary1.Service1 or rename the class. Whytheq has found it himself with a colleague and as posted it here.


More reading: Check out this article, which I've found recently: "WCF: a few tips". It explains very well troubleshooting WCF. The only change I would made to the console hosting example is to replace the using statement by a

ServiceHost host = new ServiceHost(typeof(Service));
try
{
    host.Open();

    Console.WriteLine("WCF Service is ready for requests." +  
    "Press any key to close the service.");
    Console.WriteLine();
    Console.Read();

    Console.WriteLine("Closing service...");
}
finally
{
    if (host!=null) {
            host.Close();
            host=null;
    }
}

If you want to know more about the reason why, check out this article: "Proxy open and close".

于 2012-10-09T13:02:01.017 に答える
0

これは次のように回避できます。

  • サービスの WSDL URL を参照し、WSDL をローカル ファイルに保存します。
  • 次に、ファイルに次の変更を加えます。
  • wsdl:binding に使用される名前から名前空間プレフィックスを削除します。つまり、name="wb:wsclocks-inboundSoapBinding" を name="wsclocks-inboundSoapBinding" に変更します。
  • wsdl:port 属性の binding 属性を一致するように変更し、name 属性の値から名前空間プレフィックスを削除して、wsclocks-inbound だけにします。

次に、svcutil /o:Client\WBServices /noConfig を実行します。

于 2012-10-05T16:39:02.510 に答える