就像标题所说:
我的网络服务方法调用看起来像
proxy.BeginGetWhatever(int param)
{
}
让我们假设通过此调用注册的处理程序是
private void GetWhateverCompleted(object sender, GetWhateverEventArgs e)
{
//HERE
}
如何在处理程序中访问参数param? (e.Result将返回Web服务调用应该提取的任何内容。我也有兴趣提供param)
答案 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;
}