【问题标题】:Avoid Message Contract in WCF避免 WCF 中的消息契约
【发布时间】:2015-01-21 15:34:30
【问题描述】:

您好,它可能是重复的,但写在这里,因为我无法解决我目前看到的帖子中的问题。

我的 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);

【问题讨论】:

  • 我没有看到问题?
  • 我想避免在我的客户端创建消息合约
  • 仍然没有问题。什么问题???
  • 我想在我的客户端上使用 DataContracts 而不是消息合约,但它总是在创建消息合约。

标签: c# .net wcf


【解决方案1】:

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

下面的 MSDN 文章描述了这个过程:
https://msdn.microsoft.com/en-us/library/ms733901(v=vs.110).aspx

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

【讨论】:

  • 对不起,如果我不清楚,即使我想要 DataContractSerializer Seymour,请参考我的编辑 2
【解决方案2】:

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

【讨论】:

  • @jack.. 我将我的 datacontracts 程序集共享给客户端并将服务配置为使用所有引用的程序集,但它覆盖了我的选择并创建 MessageContracts 和 Arraylist ,正如我为它配置的那样使用引用的库和集合类型作为通用列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多