構成ファイルなしのWCF構成


90

構成ファイルを使用せずにプログラムでWCFサービスを公開する方法の良い例を誰かが知っていますか?WCFを使用すると、サービスオブジェクトモデルが大幅に機能強化されたので、それが可能であることを知っています。その方法の例を見たことがありません。逆に、構成ファイルなしでの消費もどのように行われるかを確認したいと思います。

誰かが尋ねる前に、私はこれを設定ファイルなしで行う非常に特別な必要があります。私は通常、そのような方法はお勧めしませんが、前述したように、この場合は非常に具体的なニーズがあります。


1
なぜそのような方法を推奨しないのですか(構成せずにプログラムでサービスを公開する)。
BornToCode 2014年

回答:


115

私が発見したように、構成ファイルなしでWebサービスを使用するのは非常に簡単です。バインディングオブジェクトとアドレスオブジェクトを作成し、それらをクライアントプロキシのコンストラクターまたは汎用ChannelFactoryインスタンスに渡すだけです。デフォルトのapp.configを見て使用する設定を確認し、プロキシをインスタンス化する場所に静的ヘルパーメソッドを作成します。

internal static MyServiceSoapClient CreateWebServiceInstance() {
    BasicHttpBinding binding = new BasicHttpBinding();
    // I think most (or all) of these are defaults--I just copied them from app.config:
    binding.SendTimeout = TimeSpan.FromMinutes( 1 );
    binding.OpenTimeout = TimeSpan.FromMinutes( 1 );
    binding.CloseTimeout = TimeSpan.FromMinutes( 1 );
    binding.ReceiveTimeout = TimeSpan.FromMinutes( 10 );
    binding.AllowCookies = false;
    binding.BypassProxyOnLocal = false;
    binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
    binding.MessageEncoding = WSMessageEncoding.Text;
    binding.TextEncoding = System.Text.Encoding.UTF8;
    binding.TransferMode = TransferMode.Buffered;
    binding.UseDefaultWebProxy = true;
    return new MyServiceSoapClient( binding, new EndpointAddress( "http://www.mysite.com/MyService.asmx" ) );
}

たとえば、app.config(または同等の構成ファイル)を暗号化していて、組み込みのWCFを使用する必要がない場合など、別の方法でファイルを使用する場合の例として、私はこのアプローチを個人的に気に入っています接続で読み取るITの機能
ノア

18
httpsを使用する場合は、binding.Security.Mode = BasicHttpSecurityMode.Transport;を追加します。
ciscoheat 2010

これは私にとってはとてもうまくいきました。私の唯一の違いは、ReaderQuotasとセキュリティ情報も設定したことです。私はciscoheatのアドバイスを利用し、httpsを使用している場合はSecurity.Transport.ModeをTransportに設定しました(私にとっては、これはコンパイル時にわかりません)。
Kirk Liemohn、2010年

2
設定されているすべてのプロパティがWCF 4のデフォルトであるfwiwと等しいことを確認しました。(ただし、Security.ModeデフォルトはNone。です。)
ladenedge 2011

19

IISホスティングでのweb.configのSystem.ServiceModelセクションの使用をなくしたい場合は、その方法の例をここに投稿しました(http://bejabbers2.blogspot.com/2010/02/wcf -zero-config-in-net-35-part-ii.html)。ServiceHostをカスタマイズして、メタデータとwshttpbindingエンドポイントの両方を作成する方法を示します。追加のコーディングを必要としない汎用的な方法でそれを行います。すぐに.NET 4.0にアップグレードしない場合は、これは非常に便利です。


ジョン、それは素晴らしいブログ投稿だと思いますが、17か月前から受け入れられた回答があるので、あなたの回答には本当に目的がありますか?
John Saunders

36
これは私の最初のスタックオーバーフローの回答なので、通常の方法とは異なる可能性があります。素晴らしい参考文献であるLowyとBustamanteの本に精通しているので、私の答えはそれらが提供するサンプルをはるかに超えていると思います。私は主にグーグルするときにスタックオーバーフローを使用するので、頻繁に古い投稿を読みます。より最新の回答を得ることは、私の観点からのみ役立ちます。ホイールの再発明を避けるために、コードを書く前にこの投稿をグーグルで検索しました。
John Wigger

48
私は頻繁にSOユーザーとして、古いトピックに関する新しい投稿を読むことが非常に望ましいと感じています。それは私が私の仕事をよりよくするのを助け、このサイトの価値を高めます(私自身と他の人がより多く訪問するので)。ルールを持つ執事ではなく、人々が議論して、より良い答えが見つかるようにしてはどうでしょうか?それがポイントではないですか?

7
ジョン・サンダースは彼自身の質問への返答で彼の場所に置かれたようです(私が追加するかもしれない答えとして彼は受け入れていません)。私は個人的に、質問への返信が遅くても問題はありません。通常、私が尋ねた質問に対する新しい応答を、数年後ではなくても数か月後に確認できることを嬉しく思います。皮肉なことに、私はこの質問に対する私の受け入れられた答えで自分のネクロマンサーバッジを獲得しました。:)
devios1 2012年

3
私は同じ問題を抱えていましたが、受け入れられた答えは私を助けませんでした、しかしこれは、遅れた答えのための万歳!遅い回答がなかったら、私はこれについて重複した質問を作らなければならなかっただろう。
Didier A.

15

ここで、これは完全で機能するコードです。それはあなたに大いに役立つと思います。私は検索していて、完全なコードを見つけることができなかったので、完全で機能するコードを配置しようとしました。幸運を。

public class ValidatorClass
{
    WSHttpBinding BindingConfig;
    EndpointIdentity DNSIdentity;
    Uri URI;
    ContractDescription ConfDescription;

    public ValidatorClass()
    {  
        // In constructor initializing configuration elements by code
        BindingConfig = ValidatorClass.ConfigBinding();
        DNSIdentity = ValidatorClass.ConfigEndPoint();
        URI = ValidatorClass.ConfigURI();
        ConfDescription = ValidatorClass.ConfigContractDescription();
    }


    public void MainOperation()
    {
         var Address = new EndpointAddress(URI, DNSIdentity);
         var Client = new EvalServiceClient(BindingConfig, Address);
         Client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust;
         Client.Endpoint.Contract = ConfDescription;
         Client.ClientCredentials.UserName.UserName = "companyUserName";
         Client.ClientCredentials.UserName.Password = "companyPassword";
         Client.Open();

         string CatchData = Client.CallServiceMethod();

         Client.Close();
    }



    public static WSHttpBinding ConfigBinding()
    {
        // ----- Programmatic definition of the SomeService Binding -----
        var wsHttpBinding = new WSHttpBinding();

        wsHttpBinding.Name = "BindingName";
        wsHttpBinding.CloseTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.OpenTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.ReceiveTimeout = TimeSpan.FromMinutes(10);
        wsHttpBinding.SendTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.BypassProxyOnLocal = false;
        wsHttpBinding.TransactionFlow = false;
        wsHttpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
        wsHttpBinding.MaxBufferPoolSize = 524288;
        wsHttpBinding.MaxReceivedMessageSize = 65536;
        wsHttpBinding.MessageEncoding = WSMessageEncoding.Text;
        wsHttpBinding.TextEncoding = Encoding.UTF8;
        wsHttpBinding.UseDefaultWebProxy = true;
        wsHttpBinding.AllowCookies = false;

        wsHttpBinding.ReaderQuotas.MaxDepth = 32;
        wsHttpBinding.ReaderQuotas.MaxArrayLength = 16384;
        wsHttpBinding.ReaderQuotas.MaxStringContentLength = 8192;
        wsHttpBinding.ReaderQuotas.MaxBytesPerRead = 4096;
        wsHttpBinding.ReaderQuotas.MaxNameTableCharCount = 16384;

        wsHttpBinding.ReliableSession.Ordered = true;
        wsHttpBinding.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(10);
        wsHttpBinding.ReliableSession.Enabled = false;

        wsHttpBinding.Security.Mode = SecurityMode.Message;
        wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
        wsHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
        wsHttpBinding.Security.Transport.Realm = "";

        wsHttpBinding.Security.Message.NegotiateServiceCredential = true;
        wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
        wsHttpBinding.Security.Message.AlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Basic256;
        // ----------- End Programmatic definition of the SomeServiceServiceBinding --------------

        return wsHttpBinding;

    }

    public static Uri ConfigURI()
    {
        // ----- Programmatic definition of the Service URI configuration -----
        Uri URI = new Uri("http://localhost:8732/Design_Time_Addresses/TestWcfServiceLibrary/EvalService/");

        return URI;
    }

    public static EndpointIdentity ConfigEndPoint()
    {
        // ----- Programmatic definition of the Service EndPointIdentitiy configuration -----
        EndpointIdentity DNSIdentity = EndpointIdentity.CreateDnsIdentity("tempCert");

        return DNSIdentity;
    }


    public static ContractDescription ConfigContractDescription()
    {
        // ----- Programmatic definition of the Service ContractDescription Binding -----
        ContractDescription Contract = ContractDescription.GetContract(typeof(IEvalService), typeof(EvalServiceClient));

        return Contract;
    }
}

とても良い例です!手動構成のほぼすべての側面を示します。よくできました!
キルホッファー

5
EvalServiceClientがこのコードにどのように適合するかわかりません。参照されていますが、定義されていません。サーバーがクライアントを作成するのはなぜですか?
BlueMonkMN 2015


3

すべてのWCF構成はプログラムで行うことができます。したがって、設定ファイルなしでサーバーとクライアントの両方を作成することが可能です。

Juval Lowy著の「Programming WCF Services」という本をお勧めします。この本には、プログラムによる構成の多くの例が含まれています。


2

クライアント側とサーバー側の両方で非常に簡単に実行できます。Juval Lowyの本には優れた例があります。

構成ファイルについてのコメントについて言えば、構成ファイルはコードでそれを実行することに劣る2番目の人だと思います。構成ファイルは、サーバーに接続するすべてのクライアントを制御し、それらが更新されていること、およびユーザーがそれらを見つけて何も変更できないことを確認する場合に最適です。WCF構成ファイルモデルは制限があり、設計がやや困難で、メンテナンスの悪夢であることがわかりました。全体として、構成ファイルをデフォルトの方法で実行することは、MSによる非常に悪い決定でした。

編集:構成ファイルで実行できないことの1つは、デフォルト以外のコンストラクターでサービスを作成することです。これにより、静的/グローバル変数、シングルトン、およびWCFの他の種類のナンセンスが発生します。


2

このトピックに関する下記のリンクのブログ投稿は非常に興味深いものでした。

私が気に入っているアイデアの1つは、構成から適切なWCFオブジェクトにバインディングまたは動作またはアドレスXMLセクションを渡すだけで、プロパティの割り当てを処理できるようにすることです。現在、これを行うことはできません。

Web上の他のユーザーと同様に、ホスティングアプリケーション(.NET 2.0 Windowsサービス)の構成ファイルとは異なる構成ファイルを使用するには、WCF実装が必要になるという問題があります。

http://salvoz.com/blog/2007/12/09/programmatically-setting-wcf-configuration/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.