سؤال

أنا أستخدم VSTS 2008 + C# + .NET 3.0.أنا أستخدم خدمة WCF ذاتية الاستضافة.عند تنفيذ العبارة التالية، يظهر الخطأ التالي "لم يتم العثور على الرابط".لقد قمت بنشر ملف app.config الخاص بي بالكامل، هل لديك أي أفكار ما هو الخطأ؟

ServiceHost host = new ServiceHost(typeof(MyWCFService));

رسالة خطأ:

لا يمكن العثور على عنوان أساسي يطابق مخطط HTTP لنقطة النهاية مع ربط metadataexchangehttpbinding.مخططات عنوان القاعدة المسجلة هي [HTTPS].

تكوين التطبيق الكامل:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="MyBinding"
            closeTimeout="00:00:10"
            openTimeout="00:00:20"
            receiveTimeout="00:00:30"
            sendTimeout="00:00:40"
            bypassProxyOnLocal="false"
            transactionFlow="false"
            hostNameComparisonMode="WeakWildcard"
            maxReceivedMessageSize="100000000"
            messageEncoding="Mtom"
            proxyAddress="http://foo/bar"
            textEncoding="utf-16"
            useDefaultWebProxy="false">
          <reliableSession ordered="false"
               inactivityTimeout="00:02:00"
               enabled="true" />
          <security mode="Transport">
            <transport clientCredentialType="Digest"
               proxyCredentialType="None"
               realm="someRealm" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="MyWCFService"
                behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyBinding" contract="IMyService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mexServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
هل كانت مفيدة؟

المحلول

يحدد العنوان الأساسي لخدمتك "HTTPS://" - ولكن عنوان mex الخاص بك هو "HTTP".

إذا كنت تريد أن تستخدم خدمتك https://، فسوف تحتاج إلى استخدام mexHttpsBinding أيضًا:

<services>
    <service name="MyWCFService" behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" 
                binding="wsHttpBinding" 
                bindingConfiguration="MyBinding" 
                contract="IMyService" 
        />
        <endpoint address="mex" 
                binding="mexHttpsBinding" 
                contract="IMetadataExchange" 
        />
    </service>
</services>

مارك

نصائح أخرى

هل يمكنني الذهاب للدرجة مزدوجة؟ :)

وكما كنت تستخدم WS-المتشعب كنت ملزمة لبروتوكول HTTPS، لذلك تحتاج إلى استخدام MEX الصحيح ملزمة؛

<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />

لقد طرحت سؤالاً في تعليق  لـ مارك_س إجابة

هل من الممكن أن يكون لديك imetadataexchange لكل من HTTP و HTTPS كنقاط نهاية منفصلة؟

تمت الإجابة على marc_s

يجب أن تكون قادرًا على تحديد عنوان الأساس الثاني ، لـ http: // واستخدام ذلك لنقطة نهاية HTTP MEX.

لذا فإن الحل هو الإعلان عن نقاط نهاية متعددة باستخدام نفس العنوان = "mex" و مختلف الارتباطات مثل ما يلي

<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />  
<endpoint contract="IMetadataExchange" binding="mexHttpsBinding" address="mex"/>

لقد وجدت مؤخرًا أنه من الأسهل أن يكون لديك مفتاح تكوين واحد يمكن استخدامه لتمكين MEX في الاختبار وتعطيله في البث المباشر.

منhttp://msdn.microsoft.com/en-us/library/aa395224.aspx

من الممكن استخدام فئة ServiceHostFactory لإنشاء مخصص مشتق من ServiceHost في خدمات معلومات الإنترنت (IIS Custom Servicehost الذي يضيف ServiceMetadatabehavior ، (الذي يتيح نشر البيانات الوصفية) ، حتى لو لم يتم إضافة هذا السلوك بشكل صريح في ملف تكوين الخدمة.

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

رمز المثال من مقالة MSDN لمضيف الخدمة المخصصة

//Add a metadata endpoint at each base address
//using the "/mex" addressing convention
foreach (Uri baseAddress in this.BaseAddresses)
{
    if (baseAddress.Scheme == Uri.UriSchemeHttp)
    {
        mexBehavior.HttpGetEnabled = true;
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexHttpBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeHttps)
    {
        mexBehavior.HttpsGetEnabled = true;
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexHttpsBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeNetPipe)
    {
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexNamedPipeBinding(),
                                "mex");
    }
    else if (baseAddress.Scheme == Uri.UriSchemeNetTcp)
    {
        this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
                                MetadataExchangeBindings.CreateMexTcpBinding(),
                                "mex");
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top