我希望创建C#控制台应用程序,它将使用我想要的web服务(http://localhost/MyService/MyService.asmx)。
我的控制台应用程序将使用上面的webservice并将调用其中的web方法,我更愿意将控制台窗口中的值作为参数传递,比如说有来自名称“MyDetails”的web方法,所以如果我通过控制台应用程序“admin”及其“密码”然后它将在我的控制台窗口中显示结果。
例如,如果我尝试从控制台窗口运行如下:
运行>> myconsoleservice.exe MyDetails管理员密码
编辑:我想创建将使用我的webservice的控制台应用程序,并且将从参数传递Web方法的所有参数。
感谢。
最诚挚的问候,
答案 0 :(得分:2)
右键单击项目中的“参考”,然后选择“添加Web参考”。
使用参数,
public static void Main(string[] args)
{
string method = args[0];
string user = args[1];
string password = args[2];
MyService svc = new MyService();
switch (method)
{
case "MyDetails":
svc.MyDetails(user, password);
break;
case "AnoterFunction":
svc.AnotherFunction();
break;
}
}
答案 1 :(得分:2)
我的尝试......
using System;
using System.Net;
using System.Reflection;
using System.ComponentModel;
public class WSTest
{
static void Main(string[] args)
{
if( args.Length < 1 )
{
Console.WriteLine("Usage: [method_name] ([arg0], ...)");
return;
}
MyService s = new MyService();
String methodName = args[0];
MethodInfo mi = s.GetType().GetMethod(methodName);
if( mi == null )
{
Console.WriteLine("No such method: " + methodName);
return;
}
ParameterInfo[] parameters = mi.GetParameters();
if( parameters.Length != (args.Length - 1) )
{
Console.WriteLine("Invalid argument count");
return;
}
Object[] methodArgs = new Object[parameters.Length];
for( int ix = 0; ix < parameters.Length; ix++ )
{
Type parameterType = parameters[ix].ParameterType;
String arg = args[ix + 1];
try
{
methodArgs[ix] = TypeDescriptor.GetConverter(parameterType).ConvertFrom(arg);
}
catch
{
Console.WriteLine("Unable to convert from '" + arg + "' to " + parameterType);
return;
}
}
// print results
try
{
Object result = mi.Invoke(s, methodArgs);
// ObjectDumper code at http://stackoverflow.com/questions/1347375/c-object-dumper
// Alternatively, Console.WriteLine() could be used for simple value types.
ObjectDumper.Write(result);
// print any out parameters
for( int ix = 0; ix < parameters.Length; ix++ )
{
if( parameters[ix].IsOut )
{
ObjectDumper.Write(methodArgs[ix]);
}
}
}
catch( Exception e )
{
Console.WriteLine("Error invoking method '" + methodName + "'");
Console.WriteLine(e);
}
Console.WriteLine("Press enter to continue...");
Console.ReadLine();
}
}
答案 2 :(得分:1)
大多数Visual Studio版本(如果你正在使用的那样)将允许你创建一个 Web Reference ,它会生成使用Web服务的所有代码。
至于在命令行中调用基于参数的方法,您需要使用Reflection
。见下文:
static void Main(string[] args)
{
var service = new Service(); //this is your generated web service class
var method = service.GetType().GetMethod(args[0]); //gets the method from the command line
// create an array to hold the other arguments
var myArgs = new Object[args.Length-1];
for(int i=0; i<myArgs.Length; ++i)
{
myArgs[i] = args[i+1];
}
method.Invoke(service, myArgs);
}
请注意,只有当您的所有参数都是字符串时,这才有效。如果要调用其他类型的方法,则必须以某种方式将输入字符串转换为正确的类型。此外,这是C#3或更高。
答案 3 :(得分:0)
听起来您需要为服务添加Web引用。您可以使用if语句将参数与某些方法名称进行比较并调用它们,或使用反射来查找和执行这些方法。
我知道在代码中使用可能出现在服务中的新方法自动更新Web引用的方法,因为添加Web引用会创建编译到应用程序中的代码,但是您可以自己解析wsdl并创建soap请求并使用HttpWebRequest发送它。