CommunicationException提出时返回一个EF4POCO从WCF服务操作
-
25-09-2019 - |
题
以下提出了一个代码 系统。ServiceModel.CommunicationException.它的呼WCF服务的操作所谓 登录 它返回EF4POCO:
var client = new AuthServiceReference.AuthServiceClient();
try
{
Console.Write("Trying to logon...");
var session = client.Login("user", "password"); // throws CommunicationException
Console.WriteLine("done!");
Console.WriteLine("Session ID: {0}. Expires {1}",
session.Id, session.UtcExpires.ToLocalTime());
}
finally
{
client.Close();
}
我一直在调试和寻找几个小时试图找出 为什么 发生这种情况及如何解决它。我发现了什么迄今为止:
- 这可能是一系列化问题
- 当我删除了 DataMemberAttribute 从 届会 类的 所有人 部件,例外的消失,但这意味着它不会串行的。
我会感激,如果任何人都可以揭示一些关于这个问题。
下面是代码,用于服务合同、POCO类:
[ServiceContract]
public interface IAuthService
{
[OperationContract]
Session Login(string username, string passwordHash);
[OperationContract]
void Logout(Guid sessionId);
}
[DataContract]
public class Session
{
[DataMember]
public Guid Id { get; set; }
[DataMember]
public DateTime UtcCreated { get; set; }
[DataMember]
public DateTime UtcExpires { get; set; }
[DataMember] // serializes correctly if commented out
public virtual User Owner { get; set; }
public static Session Create(User owner)
{
return new Session
{
Owner = owner,
Id = Guid.NewGuid(),
UtcCreated = DateTime.UtcNow,
UtcExpires = DateTime.UtcNow.AddDays(1)
};
}
}
[DataContract]
public class User
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string PasswordHash { get; set; }
[DataMember]
public string PasswordSalt { get; set; }
[DataMember]
public bool IsContributor { get; set; }
[DataMember]
public bool IsConfirmed { get; set; }
[DataMember]
public bool IsAdmin { get; set; }
[DataMember]
public string Email { get; set; }
[DataMember]
public virtual ICollection<Post> Posts { get; set; }
[DataMember]
public virtual ICollection<Comment> Comments { get; set; }
}
解决方案
事实证明这是一个已知的问题时列化POCO代理与WCF。这里有一个 MSDN walkthough 这解释了如何使用它 系统。数据。对象。ProxyDataContractResolver.
基本上,你创建一个新的类称为 ApplyDataContractResolverAttribute 并将其应用于服务的方法返回POCOS:
[ServiceContract]
public interface IAuthService
{
[OperationContract]
[ApplyDataContractResolver]
Session Login(string username, string passwordHash);
}
using System;
using System.Data.Objects;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
namespace WcfExampleBlog.Services
{
public class ApplyDataContractResolverAttribute : Attribute, IOperationBehavior
{
#region IOperationBehavior Members
public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
{
}
public void ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
{
var dataContractSerializerOperationBehavior =
description.Behaviors.Find<DataContractSerializerOperationBehavior>();
dataContractSerializerOperationBehavior.DataContractResolver =
new ProxyDataContractResolver();
}
public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
{
var dataContractSerializerOperationBehavior =
description.Behaviors.Find<DataContractSerializerOperationBehavior>();
dataContractSerializerOperationBehavior.DataContractResolver =
new ProxyDataContractResolver();
}
public void Validate(OperationDescription description)
{
// Do validation.
}
#endregion
}
}
其他提示
我假定的"用户"类是一个定制的课吗?如果是这样,你需要添加这只是下面的与属性:
[KnownType(typeof(User))]
你还需要设置你的[数据成员]和[与]属性用户类别。
不隶属于 StackOverflow