2015-09-02 2 views
0

Я рассмотрел множество вопросов на этом сайте, которые обсуждают, но прямо не отвечают на этот вопрос. У меня есть следующие:Конфигурирование WCF, где ServiceContract и реализация сервиса находятся в отдельных сборках

В Library.dll:

namespace LibraryNamespace 
{ 
    [ServiceContract] 
    public interface IService 
    { 
     [OperationContract] 
     void Operation(); 
    } 
} 

В Implementation.dll:

namespace ImplementationNamespace 
{ 
    public class ServiceImplementation : IService 
    { 
     public void Operation() 
     { 
      // Do Something 
     } 
    } 
} 

В app.config:

<service name="ImplementationNamespace.ServiceImplementation"> 
    <endpoint 
     address="ServiceImplementation" 
     binding="netTcpBinding" 
     contract="LibraryNamespace.IService" /> 
    .... 
</service> 

И я продолжаю имея предупреждение с contract="LibraryNamespace.IService". Программа работает, но у меня такое чувство, что это предупреждение вызывает у меня больше проблем.

Атрибут «контракт» недействительно - Значение «LibraryNamespace.IService» недействительно в соответствии с его типом данными «serviceContractType» - перечисление ограничение не удалось.

Это работает, когда ServiceContract и реализация службы находятся в одной и той же сборке и пространстве имен, но по какой-то причине она здесь не работает. Как я могу правильно ссылаться?

+0

Почему вы хотите иметь их в отдельной DLL? любая конкретная причина? – Rahul

+0

Да, в основном, я хочу создать общий ServiceContract, а затем написать много других классов ServiceImplementation в разных сборках, которые следуют одному и тому же контракту на обслуживание. Таким образом, я могу стандартизировать свои ServiceImplementations и называть их стандартным способом от клиента. – user3685285

ответ

0

Я не уверен Почему вы хотите заключить договор и выполнить его в отдельной DLL? любая конкретная причина? Как правило, они будут в одной сборке, поэтому в файле конфигурации вы можете легко их отнести. Один из способов решения этой проблемы - создать конечную точку службы во время выполнения, как показано ниже.

В вашем хостинг проекта относятся как DLL Library.dll и Implementation.dll и имеют следующий код для добавления конечной точки

using LibraryNamespace; 
using ImplementationNamespace; 

// Specify a base address for the service 
String baseAddress = "http://localhost/ServiceImplementation"; 

// Create the tcp binding 
NetTcpBindings tcp = new NetTcpBindings(); 

// Define service and Create the endpoint 
using(ServiceHost host = new ServiceHost(typeof(ServiceImplementation))) 
{ 
    host.AddServiceEndpoint(typeof(IService),tcp, baseAddress); 
} 
Смежные вопросы