c# - WCF 服务在 WebForm 中调用得太早?

标签 c# asp.net wcf web-services guid

我遇到一个奇怪的问题,当从 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/

相关文章:

asp.net - 如何在 ASP.NET 动态数据中仅隐藏列表页上的列?

WCF 通过 HTTPS -> 代理 -> HTTP

c# - 可以在没有类型的情况下使用泛型吗?

c# - 从 ASP 路由处理程序返回 PHP 页面

c# - 在哪里部署配置文件和exe文件?

c# - 如何使用证书在 ASP.Net 中调用 soap API?

c# - WCF 跟踪文件不断损坏?

javascript - jquery wcf SOAP 调用失败

c# - 当返回类型为 HttpResponseMessage 时,Web Api Get() 路由不起作用

c# - WCF:身份验证服务还是基于 token 的安全性?