Я получаю следующую ошибку, когда я вызываю пользовательский объект
"Object of type 'customObject' cannot be converted to type 'customObject'."
Следующее является сценарием, когда я, получают эту ошибку:
При вызове MethodInfo. Вызовите () передающий интервал, строка в качестве параметра для моего метода хорошо работает =>, Никакие исключения не выдаются.
Но если я пытаюсь передать один из своих собственных объектов класса в качестве параметра, затем я добираюсь ArgumentException
исключение, и это не ни один ArgumentOutOfRangeException
или ArgumentNullException
.
"Object of type 'customObject' cannot be converted to type 'customObject'."
Я делаю это в веб-приложении.
Файл класса, содержащий метод, находится в другом проекте. Также пользовательский объект является отдельным классом в том же файле.
Нет такой вещи, названной a static assembly
в моем коде. Я пытаюсь вызвать webmethod динамично. этот webmethod имеет тип customObject как входной параметр. Таким образом, когда я вызываю webmethod, я динамично создаю блок прокси и так далее. От того же блока я пытаюсь создать экземпляр объекта cusotm присвоение значений к его свойствам и затем передаче этого объекта в качестве параметра и вызову метода. все динамично, и ничто не создается статичное..:(
добавьте, что ссылка не используется. Следующее является примером кода, я пытался создать его
public static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)
{
System.Net.WebClient client = new System.Net.WebClient();
//-Connect To the web service
using (System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl + "?wsdl"))
{
//--Now read the WSDL file describing a service.
ServiceDescription description = ServiceDescription.Read(stream);
///// LOAD THE DOM /////////
//--Initialize a service description importer.
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
importer.ProtocolName = "Soap12"; // Use SOAP 1.2.
importer.AddServiceDescription(description, null, null);
//--Generate a proxy client. importer.Style = ServiceDescriptionImportStyle.Client;
//--Generate properties to represent primitive values.
importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;
//--Initialize a Code-DOM tree into which we will import the service.
CodeNamespace nmspace = new CodeNamespace();
CodeCompileUnit unit1 = new CodeCompileUnit();
unit1.Namespaces.Add(nmspace);
//--Import the service into the Code-DOM tree. This creates proxy code
//--that uses the service.
ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);
if (warning == 0) //--If zero then we are good to go
{
//--Generate the proxy code
CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");
//--Compile the assembly proxy with the appropriate references
string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" };
CompilerParameters parms = new CompilerParameters(assemblyReferences);
CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);
//-Check For Errors
if (results.Errors.Count > 0)
{
StringBuilder sb = new StringBuilder();
foreach (CompilerError oops in results.Errors)
{
sb.AppendLine("========Compiler error============");
sb.AppendLine(oops.ErrorText);
}
throw new System.ApplicationException("Compile Error Occured calling webservice. " + sb.ToString());
}
//--Finally, Invoke the web service method
Type foundType = null;
Type[] types = results.CompiledAssembly.GetTypes();
foreach (Type type in types)
{
if (type.BaseType == typeof(System.Web.Services.Protocols.SoapHttpClientProtocol))
{
Console.WriteLine(type.ToString());
foundType = type;
}
}
object wsvcClass = results.CompiledAssembly.CreateInstance(foundType.ToString());
MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);
return mi.Invoke(wsvcClass, args);
}
else
{
return null;
}
}
}
Я ничего не могу найти static
в том, что я делаю.
Любая справка значительно ценится.
С уважением, Phani Kumar PV
Вы смотрели, как выглядит создаваемый прокси-класс? Вам не нужен прокси для вызова веб-службы. Просто создайте класс, наследуемый от SoapHttpClientProtocol , и вызовите Invoke (methodName, params).
Вы делаете это НАСТОЛЬКО сложнее, чем нужно. Честно.
РЕДАКТИРОВАТЬ Если вы создадите такой класс:
public class SoapClient : SoapHttpClientProtocol
{
public SoapClient()
{
}
public object[] Invoke(string method, object[] args)
{
return base.Invoke(method, args);
}
}
и назовете его так:
SoapClient soapClient = new SoapClient();
soapClient.Url = webServiceAsmxUrl;
soapClient.Invoke(methodName, args);
Я думаю, вы увидите, что он дает те же результаты, что и вы.
Позвольте мне попытаться объяснить наиболее вероятную причину возникновения проблемы в моем подходе.
Когда я вызвал метод в сборке, названный "methodname" в веб-сервисе, я пытаюсь передать необходимые для этого параметры как args [] в функцию "CallWebService" This args [] при передаче будет успешно работать, когда я попытаюсь передать обычные параметры, такие как примитивные типы, включая строку.
Но именно это я сделал, когда попытался передать настраиваемый объект в качестве параметра.
Три вещи, которые здесь выполняются.
Я устал создавать экземпляр веб-сервиса, создавая динамическую dll.
объект wsvcClass = results.CompiledAssembly.CreateInstance (foundType.ToString ());
Когда я наконец попытался вызвать метод с экземпляром созданной динамической сборки , я попытался передать customobject, созданный на шаге 1,2, через свойство args.
во время вызова CLR пытается увидеть, принадлежат ли customobject, который передается в качестве входных данных, и метод, который вызывается, из одной и той же библиотеки DLL.
, что, очевидно, отличается от способа реализации.
Итак, следующий подход, который следует использовать для решения проблемы Мне нужно создать сборку настраиваемого объекта с той же сборкой, которую я использовал для создания экземпляра веб-службы.
Я реализовал это подход полностью и все получилось отлично
MethodInfo m = type.GetMethod(methodName);
ParameterInfo[] pm = m.GetParameters();
object ob;
object[] y = new object[1];
foreach (ParameterInfo paraminfo in pm)
{
ob = this.webServiceAssembly.CreateInstance(paraminfo.ParameterType.Name);
//Some Junk Logic to get the set the values to the properties of the custom Object
foreach (PropertyInfo propera in ob.GetType().GetProperties())
{
if (propera.Name == "AppGroupid")
{
propera.SetValue(ob, "SQL2005Tools", null);
}
if (propera.Name == "Appid")
{
propera.SetValue(ob, "%", null);
}
}
y[0] = ob;
}