90

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

誰かが尋ねる前に、構成ファイルなしでこれを行うという非常に具体的な必要性があります。私は通常、このような方法はお勧めしませんが、前述したように、この場合は非常に特殊な必要性があります。

4

7 に答える 7

117

私が発見したように、構成ファイルなしで 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" ) );
}
于 2008-11-15T17:43:06.027 に答える
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 にアップグレードしない人にとって、これは非常に便利です。

于 2010-02-26T21:49:02.807 に答える
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;
    }
}
于 2012-01-19T11:17:34.903 に答える
5

サーバーでは簡単ではありません..

クライアント側では、 ChannelFactoryを使用できます

于 2008-09-10T16:28:09.417 に答える
3

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

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

于 2008-09-11T11:27:49.800 に答える
2

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

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

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

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

于 2009-04-21T21:57:15.050 に答える
2

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

構成ファイルに関するあなたのコメントについては、構成ファイルはコードで行うのに次ぐ貧弱な人だと思います。構成ファイルは、サーバーに接続するすべてのクライアントを制御し、それらが更新されていることを確認し、ユーザーがそれらを見つけて変更できないようにする場合に最適です。WCF 構成ファイル モデルは制限があり、設計がやや難しく、メンテナンスの悪夢だと思います。全体として、構成ファイルをデフォルトの方法にするという MS の決定は非常にまずかったと思います。

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

于 2009-04-21T22:24:13.550 に答える