4

サービスがリッスンするIPとポート番号を含め、WCFサービスのユーザー構成を許可しようとしています。ユーザーはこれらの値を設定できる別の構成アプリケーションを持っていますが、私が直面している問題は、新しいServiceHostエントリを作成するためにapp.configにエンドポイントを定義する必要があることです...しかし私のエンドポイントは別の構成ファイルで定義され、実行時にプログラムでバインドする必要があります。

次のことを行うと( WCF app.configエンドポイントアドレス設定をプログラムで変更する方法に基づいていますか? :

        m_SvcHost = new ServiceHost(this);

        if (Config.ServiceEndpoint != null && Config.ServiceEndpoint != String.Empty)
        {
            m_SvcHost.AddServiceEndpoint(typeof(IMyService),
                new BasicHttpBinding(),
                Config.ServiceEndpoint);
        }

        m_SvcHost.Open();

サービスは、app.configで定義されたURIと構成ファイルで定義されたURIの両方でリッスンします。元のエンドポイントを削除したり、エンドポイントを定義せずにサービスを作成したりする方法はありません。

構成アプリケーションからapp.configに書き込むことはオプションではありません。構成された値を、別のXML構成ファイルからプログラムでプルする必要があります。

何かご意見は?

編集:サービスはWindowsサービスとして実行され、HTTPエンドポイントを公開しますが、IISでホストされているWebサービスとしては実行されていません-それによって状況がまったく変わる場合

4

4 に答える 4

2

ジャスティン、

これはあなたを助けますか?このコードを使用すると、CreateServiceHost()メソッドにリストした任意のアドレスに応答できます。

public class CRSyncServiceHost : ServiceHost
{
    public CRSyncServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) { }

    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();
    }
}

public class CRSyncServiceFactory : ServiceHostFactory
{
    protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        Uri newServiceAddress = new Uri("http://someaddress.com/CRSyncService.svc");
        CRSyncServiceHost newHost = new CRSyncServiceHost(serviceType, newServiceAddress);
        return newHost;
    }
}

<%@ ServiceHost Language="C#" Debug="true" Service="CRSyncService" Factory="CRSyncServiceFactory" CodeBehind="CRSyncService.svc.cs" %>
于 2010-01-13T19:28:09.123 に答える
2

さて、私は素晴らしいWCFのバックグラウンドを持っていませんが、これは機能しますか?

m_SvcHost = new ServiceHost(this);
m_SvcHost.Description.Endpoints.Clear(); // <-- added

if (Config.ServiceEndpoint != null && Config.ServiceEndpoint != String.Empty)
{
    m_SvcHost.AddServiceEndpoint(typeof(IMyService),
        new BasicHttpBinding(),
        Config.ServiceEndpoint);
}

m_SvcHost.Open();
于 2010-01-13T20:27:56.677 に答える
1

gWizとDylanの両方の回答を組み合わせることで、これを行う方法を思いつきましたが、これらの変更で他の機能が壊れているかどうかを知るのに十分なテストは行っていません。

基本的に、私はこのクラスを追加しました:

public class MobileMonitoringSvcHost : ServiceHost
{
    protected override void ApplyConfiguration()
    {
        // skip this line to not apply default config - unsure of other ramifications of doing this yet...
        base.ApplyConfiguration();

        base.Description.Endpoints.Clear();
    }

    public MobileMonitoringSvcHost(object singletonInstance, params Uri[] baseAddresses) : base(singletonInstance, baseAddresses)
    {

    }
}

これにより、ServiceHostの「ApplyConfiguration」呼び出しがスキップされ(構成がロードされていない場合はエンドポイントが存在しないため、今のところ不必要になります)、エンドポイントがクリアされます。次に、次のことを行います。

m_SvcHost = new MySvcHost(this);


        if (Config.ServiceEndpoint != null && Config.ServiceEndpoint != String.Empty)
        {
            //m_SvcHost.Description.Endpoints.Clear();


            m_SvcHost.AddServiceEndpoint(typeof(IMobileMonitoringSvc),
                new BasicHttpBinding(),
                Config.ServiceEndpoint);
        }


        // open the svchost and allow incoming connections
        m_SvcHost.Open();

これにより、サービスは外部で構成されたエンドポイントでのみリッスンし、app.configで構成されたエンドポイントではリッスンしません。

ありがとう!

于 2010-01-13T20:44:08.250 に答える
0

構成部分を用意する必要はまったくありません。私は信じていません。つまり、すべてをコードで実行できます。.configにあるものを残すと、コードで記述したものと一緒に使用されます。

どちらかが必要な場合は、どちらかを削除する必要があると思います。

于 2010-01-13T19:16:18.227 に答える