سؤال

ولقد حصلت على الجمعية التي تحتوي على العديد من الخدمات WCF، مع كل عقد خاص بها. كل شيء يعمل بشكل جيد. التكوين الخدمة في app.config لخدمة يبدو مثل هذا:

<services>
  <service behaviorConfiguration="WcfService.AlyzaServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceWebsites">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceWebsites">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/Websites/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="Sam.Alyza.WcfService.LogReaderServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceLogReader">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceLogReader">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/LogReader/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="Sam.Alyza.WcfService.ServiceSystemverwaltungBehavior"
    name="Sam.Alyza.WcfService.ServiceSystemverwaltung">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceSystemverwaltung">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/Systemverwaltung/" />
      </baseAddresses>
    </host>
  </service>
  [...]
</services>

ومنذ أن كنت قد حصلت على مشروع أكبر في الاعتبار، مع مزيد من العقود، وأود أن يكون وسيلة للمشاركة في BaseAddress بين عقود الخدمات المختلفة.
إذا كان هذا سيكون مجرد خدمة واحدة مع العقود ونقاط النهاية مختلفة، ويمكن وضع baseaddress ommon، ولكن كيف يمكنني تحديد baseaddress مشترك لخدمة أكثر من واحد؟

وبالطبع كنت بحاجة الى شيء مماثل للعميل.

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

المحلول

ويمكنك الجمع بين جميع العقود في فئة واحدة، بحيث يكون لديك خدمة واحدة مع baseaddress واحد (أو أكثر) نقطة النهاية (s) لكل عقد.

لتفادي وجود الطبقة ملف واحد كبير يمكنك استخدام الكلمات الرئيسية جزئية (asuming استخدام ج #) لتقسيم الطبقة عبر ملفات متعددة. كل ملف يمكن تنفيذ عقد واحد، وهذا يجعل الحفاظ على واجهات الفردية أسهل بكثير.

في C ++ يمكنك استخدام #includes أو وراثة متعددة، ولكن هذا ينطوي على قدر كبير من الانضباط ...

وأن التكوين الخاص بك تبدو مثل هذا:

<services>
  <service behaviorConfiguration="WcfService.AlyzaServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceAll">
    <endpoint address="Websites/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceWebsites">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="LogReader/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceLogReader">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="Systemverwaltung/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceSystemverwaltung">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/" />
      </baseAddresses>
    </host>
  </service>
</services>

نصائح أخرى

يمكن الخدمات تتقاسم القيم BaseAddress (بما في ذلك الصورة ميناء #، إذا تم تشغيل خدمة مشاركة ميناء Net.Tcp). انها عناوين نقطة النهاية التي يجب أن تكون فريدة من نوعها. لاحظ في ملف التكوين الخاص بك أن النهاية MEX لكل ServiceHost لها عنوان "المكسيك". لديك نقاط النهاية الأخرى لديها عنوان سلسلة فارغة. عند تقديم عنوان النسبي لنقطة النهاية لتمويل رأس المال العامل (في ملف التكوين على الأقل)، وإرفاقها مسبقا العنوان الأساسي لذلك. ولذلك، فإن عنوان نقطة النهاية MEX لخدمة ينشئ logreader هو "net.tcp: // المضيف المحلي: 8731 / Design_Time_Addresses / SamAlyza / ينشئ logreader / المكسيك".

وبما أنه لم يتم تعيين عنوان النسبي على نقطة نهاية الخدمة الرئيسية، يتم استخدام عنوان قاعدة ServiceHost كما العنوان الفعلي لنقطة نهاية الخدمة الرئيسية. لأنه لا يوجد اثنين من النهاية يمكن أن يكون القيم Uri.AbsolutePath متداخلة، ومثال بك تقودك إلى الاعتقاد لا يمكن أن تكون مشتركة أن القيم العنوان الأساسي. ليس لدى الطبقة ServiceHost الذي يستضيف خدمات WCF المدمج في نقطة النهاية، في حين أن الطبقة ServiceEndpoint له خاصية ListenUri التي سوف يتم ملؤها استنادا إلى الإعدادات التي تقدمها.

إذا قمت بتغيير القيم baseAddress في المثال لكل مباراة، طالما قمت بتعيين القيم عنوان النسبية الفريدة على عناصر نقطة النهاية، كل شيء يجب أن تعمل. ومع ذلك، يبدو أن قد واجهت بعض التحديات مع النهاية MEX، لأنهم جميعا لديهم عنوان "مكس" حاليا. جعل تلك فريدة من نوعها، ويجب أن يكون على ما يرام.

والآن، يجب أن أسأل، هل أنت متأكد أنك لست مجرد الرغبة هذه الخدمات لمشاركة مساحة الاسم بدلا من عناوين القاعدة؟

ويمكنك أيضا تعيين عناوين أساسية في التعليمات البرمجية إذا كنت تستخدم ServiceHostFactory المخصصة.

في التكوين يمكن أن يكون لديك بعض الإعداد التطبيق:

<configuration>
  <appSettings>
    <add key="BaseAddress" value="http://localhost:1234" />
  </appSettings>
<configuration>

وثم جعل ServiceHostFactory مخصص:

public sealed class MyServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        var baseAddy = ConfigurationManager.AppSettings["BaseAddress"];
        baseAddresses.Add(new Uri(baseAddy));
        return new ServiceHost(serviceType, baseAddresses);
    }

}

وبعد ذلك لديك أيضا لتغيير ملفات .svc لاستخدام هذا المصنع:

<%@ ServiceHost Language="C#" Debug="true" Service="MyApp.MyService" CodeBehind="MyService.svc.cs" Factory="MyApp.MyServiceHostFactory" %>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top