কোনও কনফিগার ফাইল ছাড়াই ডাব্লুসিএফ কনফিগারেশন


90

কনফিগারেশন ফাইল ব্যবহার না করে কীভাবে প্রোগ্রামের মাধ্যমে ডাব্লুসিএফ পরিষেবাটি প্রকাশ করতে হয় তার একটি ভাল উদাহরণ কী কেউ জানেন? আমি জানি যে সার্ভিস অবজেক্ট মডেল এখন ডাব্লুসিএফ-এর সাথে আরও সমৃদ্ধ, সুতরাং আমি জানি এটি সম্ভব। কীভাবে এটি করা যায় তার কোনও উদাহরণ আমি দেখিনি। বিপরীতে, আমি দেখতে চাই যে কোনও কনফিগারেশন ফাইল ছাড়াই গ্রাহকরা কীভাবে সম্পন্ন হয়।

যে কেউ জিজ্ঞাসা করার আগে, কনফিগারেশন ফাইল ছাড়াই এটি করার আমার খুব নির্দিষ্ট প্রয়োজন। আমি সাধারণত এ জাতীয় অনুশীলনের সুপারিশ করব না, তবে আমি যেমন বলেছি, এই ক্ষেত্রে খুব নির্দিষ্ট প্রয়োজন আছে is


4
আপনি কেন এই জাতীয় অনুশীলনের (কনফিগারেশন ছাড়াই প্রোগ্রামটিমেটিকভাবে পরিষেবাটি প্রকাশ করা) প্রস্তাব করবেন না?
বার্নটোকোড

উত্তর:


115

কনফিগার ফাইল ছাড়াই ওয়েব পরিষেবা গ্রহণ করা খুব সহজ, আমি আবিষ্কার করেছি। আপনাকে কেবল একটি বাধ্যতামূলক অবজেক্ট এবং ঠিকানা অবজেক্ট তৈরি করতে হবে এবং সেগুলি ক্লায়েন্ট প্রক্সিটির নির্মাণকারীর কাছে বা জেনেরিক চ্যানেলফ্যাক্টরির উদাহরণগুলিতে দিতে হবে। কোন সেটিংস ব্যবহার করতে হবে তা দেখতে আপনি ডিফল্ট 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" ) );
}

আমি ব্যক্তিগতভাবে উদাহরণগুলির জন্য এই পদ্ধতির পছন্দ করি যখন আপনি অন্য কোনও বিষয়ে ফাইলটি ব্যবহার করতে যাচ্ছেন, উদাহরণস্বরূপ, আপনি যদি নিজের অ্যাপ্লিকেশন কনফিগ (বা সমতুল্য কনফিগারেশন ফাইল) এনক্রিপ্ট করে থাকেন এবং ডাব্লুসিএফ-তে অন্তর্নির্মিত ব্যবহারের প্রয়োজন না হয় একটি সংযোগে এর পড়ার ক্ষমতা
নোহ

18
Https ব্যবহারের জন্য, বাইন্ডিং যুক্ত করুন ecSecurity.Mode = বেসিক এইচটিপিএসকিউরিটিমোড T ট্রান্সপোর্ট;
সিস্কোহিট

এটি আমার পক্ষে বেশ ভাল কাজ করেছে। আমার পক্ষে কেবলমাত্র পার্থক্য হ'ল আমি রিডারকোটাস এবং সুরক্ষা সম্পর্কিত তথ্যও সেট করেছিলাম। আমি সিসকোয়েটের পরামর্শ ব্যবহার করেছি এবং https ব্যবহার করা হলে সুরক্ষা.ট্রান্সপোর্ট.মড ট্রান্সপোর্টে সেট করেছি (আমার জন্য এটি সংকলনের সময় জানা যায় না)।
কर्क লিমোহন

4
আমি কেবল যাচাই করেছি যে সেট করা সমস্ত সম্পত্তি ডাব্লুসিএফ 4-এ ডিফল্টের সমান, fww। (তবে এটি Security.Modeডিফল্ট হিসাবে লক্ষ্য করুন None))
ল্যাডেজ করুন

19

আপনি যদি আইআইএস হোস্টিংয়ের ওয়েবকনফিগের সিস্টেম.সেসওয়ার্স মডেল বিভাগটি সরিয়ে রাখতে আগ্রহী হন তবে আমি কীভাবে এটি করতে পারি তার একটি উদাহরণ এখানে পোস্ট করেছি ( http://bejabbers2.blogspot.com/2010/02/wcf -zero-config-in-net-35-part-ii.html )। মেটাডেটা এবং ডাব্লুএসটিপিবাইন্ডিং এন্ডপয়েন্টস উভয়ই তৈরি করতে আমি কীভাবে সার্ভিস হোস্টকে কাস্টমাইজ করতে পারি তা দেখাই। আমি এটি একটি সাধারণ উদ্দেশ্যে এমনভাবে করি যাতে অতিরিক্ত কোডিংয়ের প্রয়োজন হয় না। যারা অবিলম্বে .NET 4.0 এ আপগ্রেড করছেন না তাদের জন্য এটি বেশ সুবিধাজনক হতে পারে।


জন, আমি নিশ্চিত যে এটি একটি দুর্দান্ত ব্লগ পোস্ট, তবে যেহেতু 17 মাস আগে থেকে একটি স্বীকৃত উত্তর রয়েছে, তাই আপনার উত্তরটির সত্যই কোনও উদ্দেশ্য আছে?
জন স্যান্ডার্স

36
যেহেতু এটি আমার প্রথম স্ট্যাক ওভারফ্লো উত্তর যা সাধারণত জিনিসগুলি যেভাবে করা হয় তা নাও হতে পারে। লভি এবং বুসমন্তে বইগুলির সাথে পরিচিত হওয়া, যা দুর্দান্ত উল্লেখ রয়েছে, আমার ধারণা তারা উত্তর দেয় যে নমুনাগুলির চেয়ে আমার উত্তরটি ভাল যায়। গুগল করার সময় আমি প্রাথমিকভাবে স্ট্যাক ওভারফ্লো ব্যবহার করি তাই আমি প্রায়শই পুরানো পোস্টগুলি পড়ি। আপ টু ডেট উত্তর থাকা কেবল আমার দৃষ্টিকোণ থেকে সহায়তা করে। চাকাটি পুনরায় উদ্ভাবন এড়াতে আমি আমার কোড লেখার আগে এই পোস্টটি গুগল করেছিলাম।
জন উইগার

48
ঘন ঘন এসও ব্যবহারকারী হিসাবে, আমি পুরানো বিষয়গুলিতে নতুন পোস্ট পড়া বেশ পছন্দনীয় বলে মনে করি। এটি আমাকে আমার কাজটি আরও ভাল করতে সহায়তা করে, যা এই সাইটের মান বাড়ায় (যেহেতু আমি এবং অন্যরা এটি আরও পরিদর্শন করবে)। নিয়মকানুনের সাথে অবিচল হয়ে থাকার পরিবর্তে, লোকেরা কেন এত উত্তম উত্তরগুলি আবিষ্কার করতে পারে তা আলোচনার অনুমতি দিচ্ছেন না? বিন্দু না?

7
মনে হয় জন সান্ডার্সকে তার নিজের প্রশ্নের প্রতিক্রিয়া দিয়ে তাঁর জায়গায় রাখা হয়েছিল (যার মধ্যে কোনওটিই আমি উত্তর যুক্ত করতে পারি না বলে উত্তর দিয়েছেন)। আমার ব্যক্তিগতভাবে প্রশ্নগুলির দেরিতে জবাব দেওয়া নিয়ে কোনও সমস্যা নেই এবং আমি সাধারণত যে প্রশ্নগুলি জিজ্ঞাসা করেছি সেগুলির একটি নতুন প্রতিক্রিয়া, কয়েক মাস পরে না থাকলে মাসগুলি দেখে আনন্দিত। হাস্যকরভাবে, আমি এই খুব প্রশ্নের আমার গৃহীত উত্তর দিয়ে আমার নিজের নেক্রোম্যান্সার ব্যাজটি অর্জন করেছি। :)
ডিভাইস 1

4
আমার একই সমস্যা ছিল, এবং গৃহীত উত্তরগুলি আমাকে সাহায্য করে না, তবে দেরিতে উত্তরগুলির জন্য হররে! দেরিতে উত্তর না পেলে আমাকে এ সম্পর্কে একটি সদৃশ প্রশ্ন তৈরি করতে হত।
দিদিয়ের এ।

15

এখানে, এটি সম্পূর্ণ এবং কার্যকারী কোড is আমি মনে করি এটি আপনাকে অনেক সাহায্য করবে। আমি অনুসন্ধান করছিলাম এবং কখনই একটি সম্পূর্ণ কোড খুঁজে পাইনি তাই আমি সম্পূর্ণ এবং কার্যকরী কোড রাখার চেষ্টা করেছি। শুভকামনা।

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;
    }
}

খুব সুন্দর উদাহরণ! আপনি ম্যানুয়াল কনফিগারেশনের প্রায় প্রতিটি দিক প্রদর্শন করেন। সুন্দরভাবে সম্পন্ন!
কিলহোফার

4
আমি বুঝতে পারছি না কীভাবে EvalServiceClient এই কোডটিতে ফিট করে। এটি রেফারেন্সড, তবে সংজ্ঞাযুক্ত নয়। সার্ভার কেন একটি ক্লায়েন্ট তৈরি করছে?
ব্লুমোনকএমএন


3

সমস্ত ডাব্লুসিএফ কনফিগারেশন প্রোগ্রামক্রমে করা যেতে পারে। সুতরাং কনফিগার ফাইল ছাড়াই সার্ভার এবং ক্লায়েন্ট উভয়ই তৈরি করা সম্ভব।

আমি জুভাল লোয়ের লেখা "প্রোগ্রামিং ডাব্লুসিএফ পরিষেবাদি" বইয়ের প্রস্তাব দিচ্ছি, যাতে প্রোগ্রামেটিক কনফিগারেশনের অনেকগুলি উদাহরণ রয়েছে।


2

ক্লায়েন্ট এবং সার্ভার উভয় পক্ষেই এটি করা খুব সহজ। জুভাল লোয়ের বইয়ের দুর্দান্ত উদাহরণ রয়েছে।

কনফিগারেশন ফাইলগুলি সম্পর্কে আপনার মতামত হিসাবে, আমি বলতে পারি যে কনফিগারেশন ফাইলগুলি কোনও দরিদ্র ব্যক্তির দ্বিতীয় কোড man's কনফিগারেশন ফাইলগুলি দুর্দান্ত যখন আপনি প্রতিটি ক্লায়েন্টকে নিয়ন্ত্রণ করেন যা আপনার সার্ভারের সাথে সংযোগ স্থাপন করবে এবং নিশ্চিত হয়ে যাবে যে তারা আপডেট হয়েছে এবং ব্যবহারকারীরা সেগুলি খুঁজে পেতে এবং কিছু পরিবর্তন করতে পারবেন না। আমি ডাব্লুসিএফ কনফিগারেশন ফাইল মডেল সীমাবদ্ধ করা, নকশা করা হালকা কঠিন এবং একটি রক্ষণাবেক্ষণ দুঃস্বপ্ন দেখতে পাই find সব মিলিয়ে, আমি মনে করি কনফিগারেশন ফাইলগুলিকে কাজ করার ডিফল্ট উপায়ে তৈরি করা এমএস কর্তৃক খুব খারাপ সিদ্ধান্ত ছিল।

সম্পাদনা: কনফিগারেশন ফাইলটি আপনি যে জিনিসগুলি করতে পারবেন না তার মধ্যে একটি হ'ল অ-ডিফল্ট কনস্ট্রাক্টরগুলির সাথে পরিষেবা তৈরি করা। এটি স্ট্যাটিক / গ্লোবাল ভেরিয়েবল এবং সিঙ্গলেটন এবং ডাব্লুসিএফ-তে অন্য ধরণের অজ্ঞানগুলির দিকে পরিচালিত করে।


2

এই বিষয়টির চারপাশে নীচের লিঙ্কটিতে আমি ব্লগ পোস্টটি খুব আকর্ষণীয় পেয়েছি।

আমি পছন্দ করি একটি ধারণা হ'ল কনফিগারেশন থেকে উপযুক্ত ডাব্লুএফএফ অবজেক্টের কাছে কেবল একটি বাঁধাই বা আচরণে বা এক্সএমএল অংশকে সম্বোধন করতে সক্ষম হওয়া এবং এটির বৈশিষ্ট্যগুলি নির্ধারণ করতে পরিচালনা করতে দেওয়া - বর্তমানে আপনি এটি করতে পারবেন না।

ওয়েবে অন্যদের মতো আমার হোস্টিং অ্যাপ্লিকেশনটির (যা একটি। নেট 2.0 উইন্ডোজ পরিষেবা) এর চেয়ে আলাদা কনফিগারেশন ফাইল ব্যবহার করার জন্য আমার ডাব্লুসিএফ বাস্তবায়ন প্রয়োজন around

http://salvoz.com/blog/2007/12/09/programmatic-setting-wcf-configration/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.