Проблема развертывания WCF - PullRequest
1 голос
/ 27 января 2011

У меня есть проблема в WCF, которая сводит меня с ума.Это:

Сообщение с действием 'GetUserByUserNameAndPassword' не может быть обработано в получателе из-за несоответствия ContractFilter в EndpointDispatcher.Это может быть связано либо с несоответствием контракта (несоответствующие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем.Убедитесь, что отправитель и получатель имеют один и тот же контракт и одну и ту же привязку (включая требования безопасности, например, Сообщение, Транспорт, Нет).

Настройка выполняется следующим образом.У меня есть один веб-сервер с клиентским веб-сайтом в IIS 7, который пытается установить связь с помощью WCF с другим сервером, на котором установлен SQL Server и служба WCF, размещенная в IIS 7.

Обе эти машины находятся в одном домене.

Чтобы попытаться свести это на нет, я пытаюсь заставить это работать без какой-либо безопасности.Конфигурация клиента выглядит следующим образом:

<bindings>
    <wsHttpBinding>
        <binding name="wsHttpBinding_Normal">
        <security mode="None"/>
        </binding>
    </wsHttpBinding>
</bindings>

<client>
    <endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc"
    binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Normal"
    contract="AuditLogger.IAuditLogger" name="wsHttpBinding_IAuditLogger">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
</client>

Тогда на сервере конфигурация выглядит следующим образом:

<bindings>
    <wsHttpBinding>
        <binding name="NormalTrafficBinding">
        <security mode="None"/>
        </binding>
    </wsHttpBinding>
</bindings>

<services>
    <service name="DS.Service.ServiceImplementation.AuditLogger">
        <endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc"
        binding="wsHttpBinding" bindingConfiguration="NormalTrafficBinding"
        contract="DS.Service.ServiceContracts.IAuditLogger">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </service>
<services>

Сам метод выглядит так:

    [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "GetUserByUserNameAndPassword")]
    [FaultContract(typeof(DS.Service.FaultContracts.DSOfficeFault))]
    System.Data.DataSet GetUserByUserNameAndPassword(string userName, string password);

1 Ответ

1 голос
/ 27 января 2011

Вы должны определить один и тот же контракт на обоих концах (сервер и клиент). Хотя оба они называются IAuditLogger, они могут иметь разные подписи. Попробуйте поместить только один класс IAuditLogger в одну отдельную сборку, а затем ссылаться на него в обоих файлах конфигурации или убедитесь, что оба IAuditLogger имеют одинаковые методы.

Вы можете иметь что-то вроде:

<client>
<endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc"
binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Normal"
contract="AuditLogger.IAuditLogger" name="wsHttpBinding_IAuditLogger">
    <identity>
        <dns value="localhost" />
    </identity>
</endpoint>

И

<services>
<service name="DS.Service.ServiceImplementation.AuditLogger">
    <endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc"
    binding="wsHttpBinding" bindingConfiguration="NormalTrafficBinding"
    contract="AuditLogger.IAuditLogger">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
</service>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...