WcfTestClient: ошибка контракта IMetadataExchange - PullRequest
2 голосов
/ 15 июля 2011

Я создал приложение службы WCF, пока не запустится WcfTestClient, ошибок нет. Требуется IMetadataExchange для настройки.

Как настроить IMetadataExchange или избежать его использования?

Ошибка:

--------------------------- Тестовый клиент Microsoft WCF
--------------------------- Контракт 'IMetadataExchange' в конфигурации клиента не совпадает с именем в контракте на обслуживание, или существует нет действительного метода в этом контракте. Чтобы восстановить, пожалуйста, исправьте вручную конфигурация клиента.

Или восстановить настройки по умолчанию.

Или отметьте «Всегда перегенерировать конфигурацию при запуске служб» в Сервис -> Меню параметров, затем обновите сервис.

App.config

<system.serviceModel>
    <services>
      <service name="WcfCrmService.PermitTypesService">
        <endpoint address="" binding="wsHttpBinding" contract="WcfCrmService.IPermitTypesService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="WcfCrmService.IPermitTypesService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/WcfCrmService/Mex/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

PermitTypes

using System;
using System.Runtime.Serialization;

namespace WcfCrmService
{
    namespace TestService
    {
        [DataContract]
        public class PermitTypes
        {
            [DataMember]
            public Guid PermitTypesId;

            [DataMember]
            public String PermitName;

            [DataMember]
            public String PermitForm;

            [DataMember]
            public String PermitView;
        }
    }
}

IPermitTypesService

using System.Collections.Generic;
using System.ServiceModel;
using WcfCrmService.TestService;

namespace WcfCrmService
{
    [ServiceContract]
    public interface IPermitTypesService
    {
        [OperationContract]
        void SubmitPermitTypes(PermitTypes permit);

        [OperationContract]
        List<PermitTypes> GetPermitTypes();

        [OperationContract]
        void DeletePermitTypes(string id);
    }
}

PermitTypesService

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.ServiceModel;
using System.ServiceModel.Description;
using Microsoft.Crm.Sdk.SWSE;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using WcfCrmService.TestService;
namespace WcfCrmService
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class PermitTypesService : IPermitTypesService
    {
        public void SubmitPermitTypes(PermitTypes permit)
        {
            // Create records
        }
        public List<PermitTypes> GetPermitTypes()
        {
            // return Results
        }
        public void DeletePermitTypes(string id)
        {
            // Remove items
        }
    }
}

Сервис XML

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <s:Header>
    <a:Action s:mustUnderstand="1" u:Id="_2">http://tempuri.org/IPermitTypesService/GetPermitTypesResponse</a:Action>
    <a:RelatesTo u:Id="_3">urn:uuid:6f8c2229-da22-4ea1-b0df-e760bf51af6d</a:RelatesTo>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <u:Timestamp u:Id="uuid-090f17e6-f7a7-4e9c-8881-d19571706129-17">
        <u:Created>2011-07-15T10:35:14.132Z</u:Created>
        <u:Expires>2011-07-15T10:40:14.132Z</u:Expires>
      </u:Timestamp>
      <c:DerivedKeyToken u:Id="uuid-090f17e6-f7a7-4e9c-8881-d19571706129-7" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <o:SecurityTokenReference>
          <o:Reference URI="urn:uuid:1716f576-883e-475c-9b56-4accac413b66" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" />
        </o:SecurityTokenReference>
        <c:Offset>0</c:Offset>
        <c:Length>24</c:Length>
        <c:Nonce>GAplsFZPK8LsfnWQDwrTkQ==</c:Nonce>
      </c:DerivedKeyToken>
      <c:DerivedKeyToken u:Id="uuid-090f17e6-f7a7-4e9c-8881-d19571706129-8" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <o:SecurityTokenReference>
          <o:Reference URI="urn:uuid:1716f576-883e-475c-9b56-4accac413b66" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" />
        </o:SecurityTokenReference>
        <c:Nonce>xwL0WRp3kTTqjzEwwFnA3A==</c:Nonce>
      </c:DerivedKeyToken>
      <e:ReferenceList xmlns:e="http://www.w3.org/2001/04/xmlenc#">
        <e:DataReference URI="#_1" />
        <e:DataReference URI="#_4" />
      </e:ReferenceList>
      <e:EncryptedData Id="_4" Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
        <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <o:SecurityTokenReference>
            <o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/dk" URI="#uuid-090f17e6-f7a7-4e9c-8881-d19571706129-8" />
          </o:SecurityTokenReference>
        </KeyInfo>
        <e:CipherData>
          <e:CipherValue>CIPHERDATAK</e:CipherValue>
        </e:CipherData>
      </e:EncryptedData>
    </o:Security>
  </s:Header>
  <s:Body u:Id="_0">
    <GetPermitTypesResponse xmlns="http://tempuri.org/">
      <GetPermitTypesResult xmlns:a="http://schemas.datacontract.org/2004/07/WcfCrmService.TestService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:PermitTypes>
          <a:PermitForm>TESTPERMIT_FORM</a:PermitForm>
          <a:PermitName>TESTPERMIT_NAME</a:PermitName>
          <a:PermitTypesId>d81a9ccd-bbae-e011-9b4f-bcaec545c264</a:PermitTypesId>
          <a:PermitView>TESTPERMIT_VIEW</a:PermitView>
        </a:PermitTypes>
        <a:PermitTypes>
          <a:PermitForm>BcisCertificate</a:PermitForm>
          <a:PermitName>Сертификат соответствия БЦИС</a:PermitName>
          <a:PermitTypesId>167ac5ea-51a9-e011-9c96-bcaec545c264</a:PermitTypesId>
          <a:PermitView>BcisCertificateView</a:PermitView>
        </a:PermitTypes>
        <a:PermitTypes>
          <a:PermitForm>DLOReferenceForm</a:PermitForm>
          <a:PermitName>Справка ДЛО</a:PermitName>
          <a:PermitTypesId>16579d03-52a9-e011-9c96-bcaec545c264</a:PermitTypesId>
          <a:PermitView>DLOReferenceView</a:PermitView>
        </a:PermitTypes>
      </GetPermitTypesResult>
    </GetPermitTypesResponse>
  </s:Body>
</s:Envelope>

Sultan

1 Ответ

3 голосов
/ 15 июля 2011

Это здесь, в вашей конфигурации, безусловно, неправильно:

<endpoint address="mex" binding="mexHttpBinding" contract="WcfCrmService.IPermitTypesService" />

Конечная точка MEX для обмена метаданными должна иметь встроенный контракт WCF IMetadataExchange и не ваш собственный контракт на обслуживание.

Попробуйте использовать это:

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

Это работает сейчас ?? Тестовый клиент WCF использовал бы конечную точку MEX, чтобы узнать о вашем сервисе - если у вас там был неверный контракт на обслуживание, тестовый клиент, безусловно, не будет работать ...

Обновление: Ваш базовый адрес также немного странен:

<baseAddresses>
   <add baseAddress="http://localhost:8732/Design_Time_Addresses/WcfCrmService/Mex/" />
</baseAddresses>

Это означает, что ваш фактический сервис доступен по адресу:

http://localhost:8732/Design_Time_Addresses/WcfCrmService/Mex/

при достижении конечной точки MEX по адресу:

http://localhost:8732/Design_Time_Addresses/WcfCrmService/Mex/mex/

Я бы рекомендовал использовать лучший / более значимый базовый адрес для службы и просто добавить mex в конец конечной точки MEX:

<baseAddresses>
   <add baseAddress="http://localhost:8732/Services/WcfCrmService/" />
</baseAddresses>
...