我有一个奇怪的问题,当从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; }
}
2 回答
我可能会在某处重置或者没有正确地序列化/反序列化 . 我先看看
RequestObject
上的Guid
属性 .此外,如果您正在使用http绑定,您还可以启动Fiddler并询问传出请求,以确保Guid值正确,因为它是从您的客户端发送的 .
我不确定,但试着让它“更清晰”,因为理由似乎在其他地方 . 你正在搞乱界面属性(一般来说,这不是一个好主意,只有界面中的属性)和类属性,你“添加”一些变异器,然后标记为DataMembers ......我会发现它的原因 .
我会从改变开始
至
那个界面对我很不利 .