WCF: كيف يمكنني برمجيا إنشاء هذه القيم App.config؟

StackOverflow https://stackoverflow.com/questions/835613

  •  08-07-2019
  •  | 
  •  

سؤال

ولدي خدمة WCF الذي يعمل طيب إذا أنا إنشاء الخدمة دون تحديد أي نقطة النهاية ملزمة أو (يقرأ عليه من قيم ولدت في App.config عندما سجلت WCF عبر البصرية ستوديو).

ولدي طريقة بسيطة وترجع الإشارة الخدمة:

return new SmsServiceReference.SmsEngineServiceClient();

وهذا يعمل موافق (لأن تتم قراءة القيم من التكوين). ومع ذلك، أود الحصول على بعض من هذه القيم في قاعدة بيانات (على URI على سبيل المثال)، وأود أن تفعل شيئا مثل هذا:

        Binding binding = new BasicHttpBinding();
        EndpointAddress endpointAddress = new EndpointAddress( "my.uri.com/service.svc" );

        return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress);

وهذا لا يعمل. فإنه يطرح استثناء عندما أحاول استخدام إشارة الخدمة.

وأظن أن هذا هو لأن بلدي App.config ديه المزيد من المعلومات التي السطرين الى هناك لا توفر (الواضح). والسؤال هو، كيف يمكنني تكرار القيم App.Config التالية برمجيا؟

وهنا جزء من بلدي App.Config: (تم تغيير URI لحماية inocent)

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_ISmsEngineService" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://www.myuri.com/Services/Services.svc/basic"
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISmsEngineService"
      contract="SmsServiceReference.ISmsEngineService" name="BasicHttpBinding_ISmsEngineService" />
</client>

هل كانت مفيدة؟

المحلول

ومعظم القيم في التكوين التطبيقات أيضا خصائص في ملزمة ويمكن أن يعاد برمجيا. شخصيا، أنا استخدام أسلوب مثل واحد أدناه لإنشاء الربط


 public static BasicHttpBinding CreateBasicHttpBinding()
        {
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.AllowCookies = false;
            binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
            binding.OpenTimeout = new TimeSpan(0, 1, 0);
            binding.SendTimeout = new TimeSpan(0, 1, 0);
            // add more based on config file ...
            //buffer size
            binding.MaxBufferSize = 65536;
            binding.MaxBufferPoolSize = 534288;
            binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;

            //quotas
            binding.ReaderQuotas.MaxDepth = 32;
            binding.ReaderQuotas.MaxStringContentLength = 8192;
            // add more based on config file ...

            return binding;
        }

وأنا استخدم شيئا من هذا القبيل لخلق عنوان نقطة النهاية بلدي


public static EndpointAddress CreateEndPoint()
        {
            return new EndpointAddress(Configuration.GetServiceUri());
        }

ووserviceUri سيكون URL خدمة مثل http://www.myuri.com /Services/Services.svc/basic

وأخيرا لإنشاء عميل خدمة


 Binding httpBinding = CreateBasicHttpBinding();
 EndpointAddress address = CreateEndPoint();
 var serviceClient = new MyServiceClient(httpBinding, address);

نصائح أخرى

حسنا، نقطة النهاية العميل في التكوين تحدد هذه URL:

 <endpoint address="http://www.myuri.com/Services/Services.svc/basic"

ولكن في نموذج التعليمات البرمجية الخاصة بك، يمكنك إنشاء:

 EndpointAddress endpointAddress = new EndpointAddress( "my.uri.com/service.svc" );

وعناوين يجب أن تتطابق - إذا كان أحد في أعمال التهيئة، سوف تحتاج إلى تغيير التعليمات البرمجية إلى:

 EndpointAddress endpointAddress = new EndpointAddress( "http://www.myuri.com/Services/Services.svc/basic" );

والعقل لك - هناك العديد من الأخطاء المطبعية صغيرة في نموذج التعليمات البرمجية الخاصة بك (my.uri.com مقابل www.myuri.com، /service.svc بدلا من /Services/Services.svc)

هل يعمل مع عنوان نقطة النهاية تصحيح؟

ومارك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top