WCF 服务在 WebForm 中调用太快?

Posted

技术标签:

【中文标题】WCF 服务在 WebForm 中调用太快?【英文标题】:WCF Service called too soon in WebForm? 【发布时间】:2011-12-19 20:02:44 【问题描述】:

我遇到了一个奇怪的问题,当从 WebForms 事件处理程序内部调用时,我的 WCF 服务似乎被调用得太快了。

具体来说,传递给服务调用的 Guid 都是零,就好像它还没有被创建一样......

当我启动调试器并监视 guid 变量时,我可以看到它确实被创建为一个有效的非零 Guid。

代码如下:

protected void button_click(对象发送者,EventArgs e) var title = titleTextbox.Text; var guid = Guid.NewGuid(); var CreateIssueResponse = proxy.CreateIssue(new CreateIssueRequest 用户=用户, 问题数据合同 = 新问题数据合同(标题,guid) ); 数据绑定();

以下是合同:

CreateIssueRequest.cs:

[DataContract(Namespace = "my-service-namespace")] 公共类 CreateIssueRequest : RequestBase 公共 CreateIssueRequest() 公共 CreateIssueRequest(UserDataContract 用户,IssueDataContract 问题) 用户数据合同 = 用户; 问题数据合同 = 问题; [数据成员] 公共用户数据合同用户数据合同; [数据成员] 公共问题数据合同问题数据合同;

IssueDataContract.cs

[数据合约] 公共类 IssueDataContract : IIssue 内部问题数据合同() 公共问题数据合同(字符串标题,Guid guid) 标题=标题; 指导 = 指导; [数据成员] 公共诠释?身份证得到;内部集; [数据成员] 公共字符串标题 获取;放; [数据成员] 公共日期时间?创建日期 获取;内部集; [数据成员] 公共字符串 SupportAgentName 获取;内部集; [数据成员] 公共字符串状态获取;内部集; [数据成员] 公共Guid Guid 获取;放;

CreateIssue(来自 IssueTrackerService.cs 合同):

[服务合同(名称=“IIssueTrackerService”,命名空间=“我的服务命名空间”)] 公共接口 IIssueTrackerService [运营合同] [FaultContract(typeof(FaultBase))] [FaultContract(typeof(ArgumentException))] [FaultContract(typeof(ArgumentNullException))] CreateIssueResponse CreateIssue(CreateIssueRequest request);

服务实现(IssueTrackerService.cs):

公共类IssueTrackerService:IIsueTrackerService 只读 IUserIssueRepository userIssueRepository; 公共问题跟踪服务(IUserIssueRepository userIssueRepository) this.userIssueRepository = userIssueRepository; 公共 CreateIssueResponse CreateIssue(CreateIssueRequest 请求) // 从请求中提取用户,并验证 var user = request.UserDataContract; userValidator.Validate(user, true); // 从请求中提取问题,并验证 var issue = request.IssueDataContract; 问题验证器.验证(问题,真); // 如果用户不存在,则通过 repo 添加 if (userIssueRepository.GetUser(user.ID) == null) userIssueRepository.AddUser(user.ToEntity()); // 通过repo添加issue,记录新的issue id var issueId = userIssueRepository.AddIssue(user.ToEntity(), issue.ToEntity()); // 从数据库中获取更新字段的问题 var issueUpdate = userIssueRepository.GetIssue(issueId); // 准备并返回响应 var response = new CreateIssueResponse IssueDataContract = issueUpdate.ToDataContract() ; 返回响应;

SqlUserIssueRepository.cs

公共类 SqlUserIssueRepository : IUserIssueRepository 只读 UserIssueEntities 数据库; 公共 SqlUserIssueRepository() var connectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; db = new UserIssueEntities(connectionString); // User 和 Issue 是分别实现 IUser 和 IIssue 的 EF 复杂类型。 // IIssue 接口为 Guid 定义了一个属性 public int AddIssue(用户用户,问题问题) db.CreateUser(user.ID, user.Username, user.FirstName, user.LastName, user.Email, user.Phone); 返回用户ID;

IIsue.cs

公共接口 IIsue 诠释?身份证得到; 字符串标题 获取;放; 约会时间?创建日期 获取; 字符串 SupportAgentName 获取; 字符串状态 获取; 指导指导得到;放;

【问题讨论】:

您能出示您的服务/数据合同吗? 问题似乎在其他地方。显示服务web方法和数据库编写代码。 IssueDataContract 不匹配时的构造函数 想一想如果 .NET 在对序列有依赖关系的情况下乱序执行代码意味着什么。仔细想想,你会意识到你的代码是以正确的顺序执行的,所以这是一个不同的问题。 【参考方案1】:

我不确定,但尽量让它“更清楚”,因为原因似乎在其他地方。您正在将接口属性(通常在接口中只有属性不是一个好主意)与类属性混淆,您“添加”了一些变异器,然后标记为 DataMembers ......我会认为这就是原因。

我会从改变开始

公共类 IssueDataContract : IIsue

公共类 IssueDataContract

那个界面让我很烦。

【讨论】:

【参考方案2】:

我不认为您的问题是您的“WCF 服务被调用得太早”。它可能在某处被重置或未正确序列化/反序列化。我会先在您的RequestObject 上查看您的Guid 属性。

此外,如果您使用的是 http 绑定,您还可以启动 Fiddler 并询问传出请求,以确保 Guid 值正确,因为它是从您的客户端发送的。

【讨论】:

以上是关于WCF 服务在 WebForm 中调用太快?的主要内容,如果未能解决你的问题,请参考以下文章

在 Web 服务 WCF 中调用 Web 服务

无法从本地机器调用 WCF 服务

无法从本地机器调用 WCF 服务

记录:Web无引用无配置方式动态调用WCF服务

从类库调用 WCF 服务:App.Config 与 Web.Config?

从VB.NET Web表单调用我的第一个WCF服务中的函数会引发错误。函数调用缺少WCF函数中的参数