次のコードでは、System.ServiceModel.CommunicationExceptionが発生します。WCFサービス操作からEF4 POCOを返すときにCommunicationExceptionが発生する
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();
}
私はが、これはそれを修正する方法を&なぜ起こるかを見つけるためにしようと時間を探し&をデバッグしてきた:それはEF4 POCOを返しログイン呼ばれるWCFサービス操作を呼び出します。私がこれまでに見つけた:
- は、これは私がセッションクラスの所有者メンバーから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; }
}
を示している(Sessionクラス以下)。また、DataContractAttributeで飾られています。私はKnownTypeAttributeを追加しようとします –