我遇到一个奇怪的问题,当从 WebForms 事件处理程序内部调用时,我的 WCF 服务似乎被调用得太早。
具体来说,传递给服务调用的 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(); }
以下是契约(Contract):
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(来自 IssueTrackerService.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; } }
最佳答案
我不认为你的问题是你的“WCF 服务被调用得太早”。它可能在某个地方被重置或者没有正确序列化/反序列化。我会首先查看 RequestObject
上的 Guid
属性。
此外,如果您使用 http 绑定(bind),您还可以启动 Fiddler 并询问传出请求,以确保 Guid 值在从客户端发送时正确。
关于c# - WCF 服务在 WebForm 中调用得太早?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7972658/