webservice中具有对象参数的web方法调用动态绑定



我面临一个问题,我的web服务中有一个类似的web方法

[WebMethod]
public long SaveBusinessUserInfo(UserMaster objUser, UserEmail objEmail,string ouValue)
 {
  // Saving user info in Database    
 }
public Class UserMaster 
{ 
  public string Username{get;set;}
  public string Password{get;set;}
  public string Email{get;set;}
 }
public Class UserEmail 
{ 
  public string Id{get;set;}
  public string Email{get;set;}
  public string Country{get;set;}
 }

这些代码都在我的web服务中。现在,我必须在客户端动态调用这个web方法。我知道如何用这种方式调用一个具有正常参数的web方法,但我不知道如何调用Object parameterize函数。

在本文中,您链接到以下行调用web方法:

(T)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, args);

args参数是一个object[],它必须包含要传递给web方法的参数。在您的特定情况下,您需要它包含3个元素:

UserMaster objUser = ...
UserEmail objEmail = ...
string ouValue = ...

然后构建将传递给方法的自变量数组:

object[] args = new object[] { objUser, objEmail, ouValue };

更新:

为了引用web服务中定义的UserMasterUserEmail类,您可能需要在导入web服务时公开客户端代理生成的所有类型,然后使用反射。WebServiceInvoker类中有一个Dictionary<string, Type> availableTypes;属性,它在原始示例中是私有的。你可以公开它,然后你就可以访问这些类型。

因此:

WebServiceInvoker invoker=新WebServiceInvoker(新Uri("http://localhost/services/test.php"));

string service = "MyService";
string method = "SaveBusinessUserInfo";
Type userMasterType = invoker.AvailableTypes["FullNamespace.UserMaster"];
Type userEmailType = invoker.AvailableTypes["FullNamespace.UserEmail"];
object userMaster = Activator.CreateInstance(userMasterType);
object userEmail = Activator.CreateInstance(userEmailType);
// now that you have obtained the 2 instances you could set properties on them:
userMasterType.GetProperty("Username").SetValue(userMaster, "some username", null);
...
object[] args = new object[] { userMaster, userEmail, "foo bar" };
long result = invoker.InvokeMethod<long>(service, method, args);

这可能很快成为一场噩梦。如果您使用的是.NET 4.0,则可以使用dynamic关键字来简化此代码。

相关内容

  • 没有找到相关文章

最新更新