c# - DTO从客户端传输到服务端后变为null

标签 c# .net wcf

我有一个非常奇怪的问题:客户端上非 null 的 DTO 实例在服务器端被接收为 null 。有什么想法可能导致这种情况吗?我什至不知道应该从哪里开始寻找......


一些代码(这正是我正在执行的代码):

客户端:

public class AuthenticatedUser
{
    private readonly UserDto _user;

    // ...

    public bool SetNewPassword(string oldPasswordHash, string newPasswordHash)
    {
        using (var userService = new UserServiceClient())
        {
            if(_user == null)
                throw new InvalidOperationException("Client side");
            return userService.SetNewPassword(_user, oldPasswordHash,
                                                     newPasswordHash);
        }
    }
}

当我添加服务引用时,UserDto 类已自动创建。

服务器端:

public class UserService : IUserService
{
    // ...

    public bool SetNewPassword(UserDto userDto, string oldPasswordHash,
                                                string newPasswordHash)
    {
        using (var unitOfWork = _unitOfWorkFactory.Start())
        {
            if (userDto == null)
                throw new InvalidOperationException("Server side");

            var user = unitOfWork.Repository.Get<User>()
                                 .ByUserNameAndPasswordHash(userDto.UserName, 
                                                            oldPasswordHash);
            if (user == null)
                return false;
            user.PasswordHash = newPasswordHash;
            return true;
        }
    }
}

我收到带有“服务器端”文本的 InvalidOperationException...

更新:
服务器端的 UserDto 类如下所示:

public class UserDto
{
    public UserDto() {}

    public UserDto(User domainObject)
    {
        Mapper.Map(domainObject, this);
    }

    public String AcademicDegree { get; set; }
    public String EmailAddress { get; set; }
    public String FirstName { get; set; }
    public Gender Gender { get; set; }
    public Boolean HasChangedPassword { get; set; }
    public Int32 Id { get; set; }
    public Boolean IsActive { get; set; }
    public String LastName { get; set; }
    public IEnumerable<MailboxDto> Mailboxes { get; set; }
    public String PasswordHash { get; set; }
    public String PronunciationOfName { get; set; }
    public String Role { get; set; }
    public IList<ScheduledGreetingDto> ScheduledGreetings { get; set; }
    public LanguageDto SpeakerLanguage { get; set; }
    public String Title { get; set; }
    public String UserName { get; set; }
}

有趣的是,我尝试传输的客户端的 _user 字段是客户端通过调用另一个服务方法从服务器获得的实例,即传输 UserDto似乎一般都有效...

最佳答案

最可能的情况是 UserDto 对象不相同 - 命名空间已更改,属性不匹配。如果您使用生成的代理,请尝试更新服务引用...以确保客户端和服务器同步。

您可能想要使用 Fiddler 来查看两个应用程序之间发送的内容。这将让您检查是否是序列化问题(客户端未正确发送数据)和反序列化问题(服务器未正确接收数据)。

关于c# - DTO从客户端传输到服务端后变为null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713946/

相关文章:

c# - 带有 ISAPI 文件夹的命名空间标准

c# - 正则表达式修改

c# - 如何在 WCF 中使用 SSL 加密

.net - WebInvoke 属性可以被绑定(bind)配置替换吗

c# - 读取和写入文件

javascript - Tempdata 未显示在 View ASP.NET C# 中的图像 src 中

.net - .NET中的增量压缩

.NET 2.0/VS2005 - BringToFront() 根本不起作用

java - 从android解析jsonObject并在webservice vb.net中获取它

c# - 如何从 C# 中使用 STARTUPINFOEX 调用 CreateProcess() 并重新设置子进程的父级