Имя контракта конечной точки WCF Как его назначить, если оно универсальное?

  • IGenericService находится в сборке с именем: «ABC.Server.Common» (ABC.Server.Common.dll).
  • MyType находится в сборке с именем: «ABC.Server.Modules.X» (ABC.Server.Modules.X.dll)

КОД:

public class ABC.Server.Modules.XService :
    ABC.Server.Common.IGenericService<ABC.Server.Module.X.MyType>
{
    ABC.Server.Common.GenericResponse<ABC.Server.Module.X.MyType> DoFoo(ABC.Server.Common.GenericRequest<ABC.Server.Module.X.MyType> request)
    {
        //Do Stuff Here
    }
}

Сжатый код:

public class XService :
    IGenericService<MyType>
{
    GenericResponse<MyType> DoFoo(GenericRequest<MyType> request)
    {
        //Do Stuff Here
    }
}

Web.config:
я не использую файлы SVC, вместо этого я храню эту информацию в файле Web.config:

<add factory="System.ServiceModel.Activation.ServiceHostFactory"
     relativeAddress="Services/X.svc"
     service="ABC.Server.Modules.X.XService"/>

<service name="ABC.Server.Modules.X.XService"
         behaviorConfiguration="StandardBehavior">
  <endpoint bindingConfiguration="StandardBinding"
            binding="basicHttpBinding"
            contract="?" />
</service>

Что я должен указать в названии контракта, чтобы он действительно работал?


person michael    schedule 23.06.2011    source источник
comment
См.: stackoverflow.com/questions/6216858/generic-service-contract   -  person marc_s    schedule 23.06.2011
comment
или: stackoverflow.com/questions/6223886/   -  person marc_s    schedule 23.06.2011
comment
Обычно это не рекомендуется - WCF не может хорошо обрабатывать дженерики, поскольку он должен быть совместим и должен иметь возможность выражать все в контракте службы в определениях схемы XML - а схема XML не поддерживает дженерики....   -  person marc_s    schedule 23.06.2011
comment
@marc_s: я думал, что WCF может хорошо обрабатывать дженерики, потому что он статически типизирует вещи: IGenericService‹T› становится IGenericServiceOf_TypeT или чем-то подобным.   -  person michael    schedule 23.06.2011
comment
Вам нужно разделить две вещи: (1) внутри службы WCF это чистое программирование .NET, и вы можете использовать любые функции .NET, которые вам нравятся (включая дженерики и т. д.), но (2) вне WCF вам нужно быть совместимым, и, насколько мне известно, многие языки и системы не поддерживают дженерики, включая схему XML, которая используется для описания услуг, предоставляемых WCF.   -  person marc_s    schedule 23.06.2011
comment
@michael: marc_s прав. Вы думаете об использовании Generics для ваших DataContract и CollectionDataContract... вы можете использовать {0} ... {N} в свойстве Name атрибута для размещения имени типа. [DataContract(Name = "Get{0}")] class GetGeneric<T> даст Getint или GetFoo или т. д. в качестве имени конкретного типа. Это не работает на OperationContract или DataMember. Почему? Я понятия не имею :)   -  person myermian    schedule 28.06.2011


Ответы (1)


В общем, вы можете узнать, что WCF ожидает от вас в качестве ContractName, с помощью следующего фрагмента кода:

ContractDescription.GetContract(typeof(IGenericService<MyType>)).ConfigurationName
person alexdej    schedule 23.06.2011