2011-10-10 93 views
2

我有一個很奇怪的問題:我的DTO的客戶端非空的實例在服務器端收到爲null。任何想法可能導致這種情況?我甚至不知道我應該在哪裏開始尋找...DTO從客戶端傳輸到服務器後更改爲空


一些代碼(這是正是我執行的代碼):

客戶端:

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文本 「服務器端」 ......

UPDATE:
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似乎一般工作...

+0

你可以顯示UserDto類嗎?另外,您能否提供關於您正在使用的頻道以及您如何生成代理類的更多詳細信息? –

回答

3

最有可能的情況是, UserDto對象不相同 - 名稱空間已更改,屬性不匹配。如果您使用生成的代理,請嘗試Update Service Reference...以確保客戶端和服務器同步。

您可能想使用Fiddler來查看兩個應用程序之間發送了什麼。這將讓你檢查它是否是序列化問題(客戶端沒有正確發送數據)和解序列化問題(服務器沒有正確接收數據)。

+0

更新服務參考解決了問題。我不明白爲什麼,因爲Dto從服務器到客戶端的傳輸工作,我不記得改變任何東西......無論如何,它解決了我的問題,謝謝! :-) –

+0

@DanielHilgarth比較'ServiceReference.cs'文件(生成的類)以準確查看更改的內容是很酷的......但這通常是第一次嘗試。你極有可能在不考慮它的情況下改變一些小的事物。 –

+0

是的,你是對的。儘管我沒有考慮保存它...... –

相關問題