如何检索在Completed事件的处理程序中传递给Web Service Async方法的参数

时间:2010-02-11 22:39:31

标签: c# web-services event-handling

就像标题所说:

我的网络服务方法调用看起来像

proxy.BeginGetWhatever(int param)
{
}

让我们假设通过此调用注册的处理程序是

private void GetWhateverCompleted(object sender, GetWhateverEventArgs e)
{
    //HERE
}

如何在处理程序中访问参数param? (e.Result将返回Web服务调用应该提取的任何内容。我也有兴趣提供param)

2 个答案:

答案 0 :(得分:1)

为WCF代理生成的每个异步方法都会有一个带有userState参数的重载。例如,如果您使用GetCustomerByID方法,则会看到两个重载:

public void GetCustomerByIDAsync(Guid customerID) { ... }
public void GetCustomerByIDAsync(Guid customerID, object userState { ... }

您可以在userState中放置任何内容,并在完成事件中将其发回。因此,如果您只想要原来的customerID,则在上述情况下:

public void BeginGetCustomerByID(Guid customerID)
{
    // Second instance of customerID is userState
    service.GetCustomerByIDAsync(customerID, customerID);
}

private void service_GetCustomerByIDCompleted(object sender,
    GetCustomerByIDCompletedEventArgs e)
{
    Guid customerID = (Guid)e.UserState;
    // Do something with e.Error or e.Result here
}

您可以在userState中放置任何内容,因此如果该方法需要多个参数,您可以将它们全部放入自定义类中,并将该类作为状态传递。

答案 1 :(得分:0)

您的网络方法必须以某种方式返回它。假设你的webmethod是将原始参数和其他一些数据返回给调用者,这里是web方法签名:

CustomReturnClass GetWhatever(int param);

Web服务中定义的CustomReturnClass的定义。

public class CustomReturnClass
{
   public int OrigParameter { get; set; }
   public object OtherStuff { get; set; }
}

然后在你的回调(传统风格)中你会有:

private void GetWhateverCompleted(IAsynchResult res)
{
    CustomReturnClass retVal = (CustomReturnClass)res.EndGetWhatever(res);
    int origParam = retVal.OrigParameter;
}

然而,看起来,就像你正在使用WCF一样,所以它更像是这样:

private void GetWhateverCompleted(object sender, GetWhateverEventArgs e)
{
    CustomReturnClass retVal = e.Result;
    int origParam = retVal.OrigParameter;
}