веб-метод в веб-сервисе с параметрами объекта вызывает динамическое связывание - PullRequest
0 голосов
/ 10 февраля 2012

Я столкнулся с проблемой, у меня есть веб-метод в моем веб-сервисе, подобный этому

[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;}
 }

Весь этот код находится в моем веб-сервисе. Теперь мне нужно динамически вызывать этот веб-метод на моем клиентеконец.Я знаю, как вызвать веб-метод с обычным параметром, используя , таким образом , но я не знаю, как вызвать функцию параметризации объекта.

1 Ответ

0 голосов
/ 10 февраля 2012

В статье, которую вы связали со следующей строкой, вызывается веб-метод:

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

Параметр args - это object[], который должен содержать параметры, передаваемые вашему веб-методу.В вашем конкретном случае вам нужно, чтобы он содержал 3 элемента:

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

и затем строил массив аргументов, который будет передан методу:

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

ОБНОВЛЕНИЕ:

Чтобы сослаться на классы UserMaster и UserEmail, которые определены в вашем веб-сервисе, вам может понадобиться предоставить все типы, сгенерированные прокси-клиентом при импорте веб-сервиса, а затем использовать отражение.В классе WebServiceInvoker есть свойство Dictionary<string, Type> availableTypes;, которое является приватным в исходном примере.Вы можете сделать его общедоступным, и тогда у вас будет доступ к этим типам.

Итак:

WebServiceInvoker invoker = new WebServiceInvoker (new 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 , чтобы упростить этот код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...