2011-11-01 26 views
0

我有一個奇怪的問題,看起來我的WCF服務在WebForms事件處理程序中被調用時太快。WCF服務在WebForm中調用得太快?

具體的GUID傳遞給服務調用全部爲零,因爲如果它沒有被創建...

當我火起來的調試器,把手錶上GUID變量,我可以看到它確實被創建爲一個有效的非零Guid。

下面的代碼:

 
protected void button_click(object sender, EventArgs e) 
{ 
    var title = titleTextbox.Text; 
    var guid = Guid.NewGuid(); 

    var CreateIssueResponse = proxy.CreateIssue(new CreateIssueRequest 
    {                
     User = user,          
     IssueDataContract = new IssueDataContract(title, guid) 
    }); 

    dataBind(); 
} 

這裏有合同:

CreateIssueRequest.cs:

 
[DataContract(Namespace = "my-service-namespace")] 
public class CreateIssueRequest : RequestBase 
{ 

    public CreateIssueRequest() { } 

    public CreateIssueRequest(UserDataContract user, IssueDataContract issue) 
    { 
     UserDataContract = user; 
     IssueDataContract = issue; 
    } 

    [DataMember] 
    public UserDataContract UserDataContract; 

    [DataMember] 
    public IssueDataContract IssueDataContract; 
} 

IssueDataContract.cs

 
[DataContract] 
public class IssueDataContract : IIssue 
{ 
    internal IssueDataContract() { } 

    public IssueDataContract(string title, Guid guid) 
    { 
     Title = title; 
     Guid = guid; 
    } 

    [DataMember] 
    public int? ID { get; internal set; } 

    [DataMember] 
    public string Title { get; set; } 

    [DataMember] 
    public DateTime? DateCreated { get; internal set; } 

    [DataMember] 
    public string SupportAgentName { get; internal set; } 

    [DataMember] 
    public string Status { get; internal set; } 

    [DataMember] 
    public Guid Guid { get; set; } 
} 

CreateIssue(從IssueTracke rService.cs合同):

 
[ServiceContract(Name = "IIssueTrackerService", Namespace = "my-service-namespace")] 
public interface IIssueTrackerService 
{   
    [OperationContract] 
    [FaultContract(typeof(FaultBase))] 
    [FaultContract(typeof(ArgumentException))] 
    [FaultContract(typeof(ArgumentNullException))] 
    CreateIssueResponse CreateIssue(CreateIssueRequest request); 
} 

服務實現(IssueTrackerService.cs):

 
public class IssueTrackerService : IIssueTrackerService 
{ 
    readonly IUserIssueRepository userIssueRepository; 

    public IssueTrackerService(IUserIssueRepository userIssueRepository) 
    { 
     this.userIssueRepository = userIssueRepository; 
    } 

    public CreateIssueResponse CreateIssue(CreateIssueRequest request) 
    { 
     // Extract the user from the request, and validate 
     var user = request.UserDataContract; 
     userValidator.Validate(user, true); 

     // Extract the issue from the request, and validate 
     var issue = request.IssueDataContract; 
     issueValidator.Validate(issue, true); 

     // If the user doesn't exist, add them via the repo 
     if (userIssueRepository.GetUser(user.ID) == null) 
      userIssueRepository.AddUser(user.ToEntity()); 

     // Add the issue via the repo, record the new issue id 
     var issueId = userIssueRepository.AddIssue(user.ToEntity(), issue.ToEntity()); 

     // Get the issue with it's updated fields from the db 
     var issueUpdate = userIssueRepository.GetIssue(issueId); 

     // Prepare and return the response 
     var response = new CreateIssueResponse { IssueDataContract = issueUpdate.ToDataContract() }; 
     return response; 
    } 
} 

SqlUserIssueRepository.cs

 
public class SqlUserIssueRepository : IUserIssueRepository 
{ 
    readonly UserIssueEntities db; 

    public SqlUserIssueRepository() 
    { 
     var connectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; 
     db = new UserIssueEntities(connectionString); 
    } 

    // User and Issue are EF complex types that implement IUser & IIssue respectively. 
    // The IIssue interface defines a property for Guid 
    public int AddIssue(User user, Issue issue) 
    { 
     db.CreateUser(user.ID, user.Username, user.FirstName, user.LastName, user.Email, user.Phone); 
     return user.ID; 
    } 
} 

IIssue.cs

 
public interface IIssue 
{ 
    int?  ID    { get; } 
    string Title   { get; set; } 
    DateTime? DateCreated  { get; } 
    string SupportAgentName { get; } 
    string Status   { get; } 
    Guid  Guid    { get; set; } 
} 
+1

你能展示你的服務/數據合同嗎? – deha

+0

問題似乎還在其他方面。顯示服務Web方法和數據庫寫入代碼。 – Kon

+1

構造函數如果IssueDataContract不匹配 – deha

回答

3

我不認爲你的問題是你的「WCF服務被稱爲過早」。它可能被重置在某個地方,或者沒有正確的序列化/反序列化。我會首先在RequestObject上看看你的Guid酒店。另外,如果您使用的是http綁定,您也可以啓動Fiddler並詢問傳出的請求,以確保Guid值正確,因爲它是從您的客戶端發送的。

1

我不確定,但儘量去做因爲理由似乎是別的什麼地方,所以它「更清晰」。你正在搞亂界面屬性(這通常不是一個好主意,只有界面中的屬性),你「添加」了一些增變器,然後標記爲DataMembers ...我會拍那是有原因的。

我就從改變

公共類IssueDataContract開始:IIssue

公共類IssueDataContract

該接口是非常搞亂的東西最多我。