を呼び出した後Webservices
、オブジェクト (このオブジェクトはカスタム オブジェクト クラスです) をクライアントに返します。そこで、このオブジェクトからカスタム クラスに変換したいと思います。
-ウェブサービス:
[WebMethod]
public Cls_ROLES GetRoles(int firstNum)
{
Cls_ROLES o = new Cls_ROLES();
o.Role_ID = 2;
o.RoleName = "binh";
return o;
}
-クライアント:
+機能:
public 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);
object o = new object();
o=mi.Invoke(wsvcClass, args);
return o;
}
else
{
return null;
}
}
}
+Page_Load 関数:
Line 1:object[] args=new object[1];
Line 2:args[0]=1;
Line 3:o = this.CallWebService("http://localhost:1814/HelloServices/Service.asmx", "Hello", "GetRoles", args);
Line3 のオブジェクト (このオブジェクトはカスタム オブジェクト クラス) をクライアントに返します。そこで、このオブジェクトをカスタムクラス(Cls_Roleオブジェクト)に変換したいと思います。//================================================ ====================================== //========== ================================================== ========================== //====================== ================================================== ============== Selalu_Ingin_Belajarの答えとして、私はWebサービスからクライアントへの価値をうまく得ることができます。
object yourObject = new object();
foreach (PropertyInfo property in yourObject.GetType().GetProperties())
{
object value = property.GetValue(yourObject , null);
Console.WriteLine("{0} = {1}", property.Name, value);
}
その横に、別のプロジェクトに適用すると、別のエラーが表示されます: パラメータ数が一致しません。VisualStudio ツールで AddWebReference を使用する場合。Reference.cs ファイルが自動生成されます。
/// <remarks/>
[System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:ALBAPI", ResponseNamespace="urn:ALBAPI")]
[return: System.Xml.Serialization.SoapElementAttribute("info")]
public ResponseInfo getSetupLicenseRows(out SetupLicenseRowsValues values) {
object[] results = this.Invoke("getSetupLicenseRows", new object[0]);
values = ((SetupLicenseRowsValues)(results[1]));
return ((ResponseInfo)(results[0]));
}
そのため、オブジェクトの SetupLicenseRowsValues クラスを渡すことで、webClient から簡単に呼び出すことができます。ここで、手動でパラメーターを WebServices に渡す必要があります。この生成ファイルは使用しないでください。
クライアント:
public 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);
object o = new object();
Line error: o = mi.Invoke(wsvcClass, new object[0]);
return o;
}
else
{
return null;
}
}
}
public void call()
{
string WebserviceUrl = "http://192.168.2.19:3333/ALBAPI.wsdl";
string serviceName = "ALBAPI";
string methodName = "getSetupLicenseRows";
object[] args=new object[0];
object sSessionID = CallWebService(WebserviceUrl, serviceName, methodName,args);
foreach (PropertyInfo property in sSessionID.GetType().GetProperties())
{
object value = property.GetValue(sSessionID, null);
Console.WriteLine("{0} = {1}", property.Name, value);
}
}
これで、回線エラー時に「パラメータ数の不一致」というエラーが表示されるようになりました。とにかく助けてくれてありがとう