2

この質問は、私のコンピューターで 100% 動作していないことを発見した以前の続きです:非開発マシンで WCF サービスが実行されていません

私はこの例に取り組んでいます:

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

ここでは、InstallUtil ステップが実際には機能していないことがわかりました。VS2010 でプロジェクトが開いていて、チュートリアルの手順 8 のようにサービス参照を追加すると、VS2010 が実際にサービス ホストを起動するため、参照が作成されることがわかりました。

これまでにデバッグした方法は次のとおりです。

  • InstallUtil に従ってサービスをインストールし、VS2010 ソリューションを閉じます。次に、まったく別のソリューション (TESTWCF) を開きます。サービス参照を追加しようとすると失敗します - 指定されたアドレスで見つかりません

  • VS2010 の別のインスタンスとして WCFServiceLibrary1 プロジェクトを再度開きます。サービス参照を TESTWCF に追加しようとすると失敗します。

  • WCFServiceLibrary1 内で、ステップ 8 を試みます - サービス参照を追加します。これにより、サービス ホストが開始され、サービスが検出されます。

  • サービス ホストがまだ実行されている状態で、TESTWCF でサービスを追加しようとすると、機能します。

  • サービス ホストを閉じて、TESTWCF に参照を追加しようとすると、再び機能しません。

これはすべて、InstallUtil によってインストールされたサービスが実行されているか実行されていないかに完全に依存していないようです。

また、新しい仮想サーバーをゼロから作成し、1 つずつロードすることで、これを確認しました。そして、VS2010がインストールされたときにのみ、動作し始めました-私が上で観察したとき。

何か案は ?

4

2 に答える 2

2

WCF サービスは、アプリケーション (コンソールや Windows フォーム アプリケーションなど) で自己ホストできます。

複雑にしすぎていると思います。InstallUtil でインストールする必要さえありません。InstallUtil はそれをインストールして Windows サービスとして実行し、WCF サービスとして機能するコンソール アプリケーションを作成できます。

以下をインポートする必要があります。

System.ServiceModel
System.ServiceModel.Web
System.Web.Services

get や post で Web サービスとして使いたい場合は、web があるものが必要になると思います。

次に、クライアントとサーバーのコントラクトを指定する必要があります。

[ServiceContract(Name = "SomeService", Namespace = "http://some.domain.com/some/someservice",SessionMode=SessionMode.Required)]
    public interface ISomeService
    {
        [OperationContract]
        string Execute(string expression);
    }

契約があり、サービスに実装する必要があります。このインターフェイスを使用するだけで、特別なことは何もありません。

非常に重要なのは app.config です。クライアントとサービスに対して適切に指定する必要があります。構成には、サービスを指すすべてのものがあります。

クライアントでは、参照としてサービスを追加する必要があります。ポイント 8 のようにそれを見つける必要がありますが、設定が問題ない場合に限ります!

クライアントでは、次のようなコードで何かをするだけです:

 using (ChannelFactory<ISomeService> channel = new ChannelFactory<ISomeService>("SomeService"))
            {
                ISomeService svc = channel.CreateChannel();
                svc.Execute("my expression to evaluate by the service");
             }

InstallUtil などを使用せずに最も簡単な方法を試してみてください。ネットワーク経由でサービスを提供するのに Windows サービスである必要はありません。

于 2012-12-06T07:37:18.677 に答える
1

成功 !これに 4 日間ほど費やした後、MSDN のチュートリアルには致命的な欠陥がありました。

チュートリアルの最初のステップでは、wcf サービス ライブラリを作成し、デフォルトでサービス Service1 という名前を付けます。チュートリアルのステップ 2.6 で、ベース アドレスを指定するよう求められます。

net.tcp://localhost:8523/Service1 

ステップ 3 新しい Windows サービスを作成するよう求められます。デフォルトでは、これは Service1 とも呼ばれます。

ステップ 5.2 では、System.ServiceModel と WcfServiceLibrary1 への参照を作成するよう求められます。

ステップ 5.6 で Onstart メソッドを置き換えてサービスを開始し、ステップ 8 で最終的なコードを次のように示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.ServiceModel;
using WcfServiceLibrary1;

namespace WindowsService1
{
public partial class Service1: ServiceBase
{
    internal static ServiceHost myServiceHost = null; 

    public WCFServiceHost1()
    {
        InitializeComponent();
    }
    protected override void OnStart(string[] args)
    {
        if (myServiceHost != null)
        {
            myServiceHost.Close();
        }
        myServiceHost = new ServiceHost(typeof(Service1));
        myServiceHost.Open();
    }
    protected override void OnStop()
    {
        if (myServiceHost != null)
        {
            myServiceHost.Close();
            myServiceHost = null;
        }
    }
}
}

間違っている重要なコード行は次のとおりです。

        myServiceHost = new ServiceHost(typeof(Service1));

VS2008 または 2005 では動作が異なるか、VS2010 の構成である可能性がありますが、私の VS2010 は Service1 を含むクラスのそれであると解釈します。

WindowsService1.Service1

実際には次のようにする必要があります。

WcfServiceLibrary1.Service1

4 日前に気づいたのですが、WCF について十分な知識がなく、どういうわけか間違っていたと思いました。

于 2012-12-06T14:02:46.460 に答える