Ошибка конфигурации конечной точки WCF: недопустимый атрибут "контракт"?

у меня есть служба WCF, назовем ее UserService. The UserService имеет ссылку на библиотеку классов. Назовем это DoWork.dll. The DoWork.dll имеет ссылку службы WCF на другую службу, которую мы будем называть CompanyService.

теперь, когда я впервые попытался вызвать UserService Я бы получил сообщение об ошибке конечной точки, не настроенное. После прочтения в Интернете я обнаружил, что мне нужно добавить CompanyService привязки и информация о клиенте в UserService ' s web.config под <system.serviceModel> узел.

вот это:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IComapnyService" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint name="BasicHttpBinding_ICompanyService"
          address="http://it-dev.company.local:81/Project/Copmpany/CompanyService.svc"
          binding="basicHttpBinding" 
          bindingConfiguration="BasicHttpBinding_IComapnyService"
          contract="CompanyService.ICompanyService"  />
    </client>

проблема у меня-это contract="CompanyService.ICompanyService" показывает мне ошибку:

недопустимый атрибут 'contract' - значение ' CompanyService.ICompanyService "является недопустимым в соответствии с его типом данных "clientContractType" - ошибка ограничения перечисления.

теперь, если я добавлю CompanyService ссылка непосредственно на UserService проект WCF, ошибка уходит (очевидно). Однако я не должен был этого делать. Я попытался полностью квалифицировать пространство имен ICompanyService контракт заключен, и это тоже не работает. Я удалил .suo файл и перестроить проект, и это тоже не работает (предлагается в другом месте в интернете). Кроме того, если я наберу contract=, я получаю выпадающий список, но CompanyService.ICompanyService нигде не найти (только когда я ссылаюсь на службу непосредственно в ).

я попытался настроить его с помощью Tools > WCF Service Configuration Editor и это не помогло.

отмечу кажется, все работает нормально, но мне не нравится тот факт, что intellisense дает мне синее волнистое подчеркивание и это сообщение об ошибке. У меня такое чувство, что мне нужно что-то еще в web.config чтобы заставить это работать с UserService ссылки DoWork.dll, который в свою очередь ссылается на CompanyService чей контракт я не вижу правильно.

любые предложения очень ценятся. Спасибо заранее.

1 ответов


вы правы - вы не должны этого делать.

архитектура наличия DLL (DoWork.dll) с" ссылкой на службу " (ComanyService) плохо. Если DLL не имеет жестко закодированной конечной точки клиента (в коде) для вызова CompanyService для вас, то любой, кто использует DLL, должен будет попытаться выяснить, как настроить конечную точку клиента для службы, о которой они не знают. Что ваши нарваться.

причина, по которой это работает при добавлении службы ссылка непосредственно из вашего UserService заключается в том, что при этом вы получаете копию ServiceContract из метаданных CompanyService. Чтобы доказать это, посмотрите в справке.cs-файл, который генерируется get, ищет CompanyService, и вы найдете, что он имеет атрибут [ServiceContract], идентифицируя его как службу WCF. Кроме того, вы увидите атрибуты [OperationContract] для методов, а также любые [DataContracts] службы my также exchange. Другими словами, все эти "типы" есть импортированный в проект и при компиляции, WCF теперь может найти эти типы при создании экземпляра конечной точки клиента.

Если CompanyService является одной из ваших служб, рассмотрите возможность извлечения определения ServiceContract (интерфейса) в отдельную DLL. Затем вы можете ссылаться на эти типы как на "ссылки на сборку" из службы (CompanyService) и любых клиентских приложений, таких как UserService. По крайней мере, вам не нужно добавлять ссылку на службу. Но, ты еще надо заселить .... раздел в вашей заявке на услугу, которую вы технически не можете знать детали. Не лучший подход.

лучший подход-переместить зависимость службы из DoWork.файл DLL. Вы можете сделать это, просто переместив логику в реализацию UserService.

или, если вам нужно сохранить DoWork.dll независима, а затем рассмотрите обертывание DoWork с помощью службы WCF, которая зависит от службы CompanyService. Затем, в UserService добавьте ссылку на новую службу DoWork. Это больше соответствует арендаторам SOA и позволит вашим услугам развиваться самостоятельно.