避免在WCF中使用消息合同

时间:2015-01-21 15:34:30

标签: c# .net wcf

嗨,这可能是重复但写在这里,因为我无法解决迄今为止我看过的帖子中的问题。

我在我的WCF服务和我的客户端上使用DataContracts我只想将我的服务用作DataContract对象,但是当我创建服务引用时,我的WCF服务生成所有方法的消息契约。

  [ServiceContract]

public interface IUserService
{
    [OperationContract]
     UserVO GetUser(int Id);
}

[DataContract]
public Class UserVO
{
 [DataMember]
 public int Id{get;set;};
}

我已经取消了"始终生成消息合同"并在实体可用的引用库中检查重用类型(数据合同)。

我的reference.cs正在签订消息合同,如

System.ServiceModel.MessageContractAttribute(WrapperName="GetUser",      WrapperNamespace="http://tempuri.org/", IsWrapped=true)]
public partial class GetUserRequest {
 }

编辑1:

我的Reference.svcmap有这样的客户端配置

 <ClientOptions>
<GenerateAsynchronousMethods>false</GenerateAsynchronousMethods>
<EnableDataBinding>true</EnableDataBinding>
<ExcludedTypes />
<ImportXmlTypes>false</ImportXmlTypes>
<GenerateInternalTypes>false</GenerateInternalTypes>
<GenerateMessageContracts>false</GenerateMessageContracts>
<NamespaceMappings />
<CollectionMappings>
  <CollectionMapping TypeName="System.Collections.Generic.List`1" Category="List" />
</CollectionMappings>
<GenerateSerializableTypes>true</GenerateSerializableTypes>
<Serializer>Auto</Serializer>
<UseSerializerForFaults>true</UseSerializerForFaults>
<ReferenceAllAssemblies>true</ReferenceAllAssemblies>
<ReferencedAssemblies />
<ReferencedDataContractTypes />
<ServiceContractMappings />

编辑2: 我正在尝试实现类似下面的内容

[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IUserService/GetUserDetails", ReplyAction="http://tempuri.org/IUserService/GetUserDetailsResponse")]
    [System.ServiceModel.FaultContractAttribute(typeof(UserServiceFaultContract), Action="http://tempuri.org/IUserService/GetUserDetailsUserServiceFaultContractFault", Name="UserServiceFaultContract", Namespace="http://schemas.datacontract.org/2004/07/mynamespace")]
    MyEntities.UserVO GetUserDetails(int id);

2 个答案:

答案 0 :(得分:0)

默认情况下,WCF使用DataContractSerializer类来序列化数据类型。如果您的方案需要使用XmlSerializer,那么您可以通过将XmlSerializer属性应用于您的服务来手动切换到XmlSerializerFormatAttribute

以下MSDN文章介绍了该过程:
https://msdn.microsoft.com/en-us/library/ms733901(v=vs.110).aspx

建议在切换序列化类之前仔细考虑安全说明。

答案 1 :(得分:0)

然后与客户共享程序集!将服务接口和所有DataContracts放在一个程序集中。然后客户端可以使用channelfactoryfactory“pattern”连接到WCF服务。