如何创建c#控制台应用程序以使用.net Web服务

时间:2011-02-28 18:43:36

标签: c#

我希望创建C#控制台应用程序,它将使用我想要的web服务(http://localhost/MyService/MyService.asmx)。

我的控制台应用程序将使用上面的webservice并将调用其中的web方法,我更愿意将控制台窗口中的值作为参数传递,比如说有来自名称“MyDetails”的web方法,所以如果我通过控制台应用程序“admin”及其“密码”然后它将在我的控制台窗口中显示结果。

例如,如果我尝试从控制台窗口运行如下:

运行>> myconsoleservice.exe MyDetails管理员密码

编辑:我想创建将使用我的webservice的控制台应用程序,并且将从参数传递Web方法的所有参数。

感谢。

最诚挚的问候,

4 个答案:

答案 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发送它。