嗨,这可能是重复但写在这里,因为我无法解决迄今为止我看过的帖子中的问题。
我在我的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);
答案 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服务。