【问题标题】:How to create c# console application to cosume the .net webservice [closed]如何创建 C# 控制台应用程序以使用 .net Web 服务 [关闭]
【发布时间】:2011-02-28 18:43:35
【问题描述】:

我正在寻找创建 C# 控制台应用程序,它将使用我想要的 Web 服务 (http://localhost/MyService/MyService.asmx)。

我的控制台应用程序将使用上面的 web 服务并在其中调用 web 方法,我更愿意将控制台窗口中的值作为参数传递,比如是否有来自名称“MyDetails”的 web 方法,所以如果我通过控制台应用程序“admin”和它的“password”然后它会在我的控制台窗口上给出结果。

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

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

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

谢谢。

最好的问候,

【问题讨论】:

  • 问题是什么?
  • 伙计们,我想创建一个使用我的 web 服务的控制台应用程序,然后从控制台窗口,我会将参数传递给 web 方法,它会相应地返回结果
  • 为了澄清......“管理员”和“密码”是 Windows 凭据吗?还是它们是“MyDetails”方法的论据?
  • @dana 它们是 webmethod "MyDetails" 的参数,在上面我只给出了两个参数,但是参数列表可以更多,所以我希望创建更通用的代码,以便我可以使用任何网络服务和其中的任何方法,只需要从控制台传递参数。

标签: c#


【解决方案1】:

我的尝试...

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();
    }
}

【讨论】:

  • @thanks dana,所以打印 s.MyMethod() 生成的结果;在控制台窗口上,我们只需要获取所有值并使用console.print,这样我们就可以在控制台窗口本身上看到结果
  • @Dana,为什么我们使用 s.Credentials = new NetworkCredentials(userName, password);因为这些用户名和密码是我的 web 方法的参数,这些参数也可以是动态的,所以需要更多通用代码
  • @MKS - 很抱歉。我对这个问题感到困惑,并更新了我的代码以将动态参数用于调用的方法。
  • @Dana this line "Type[] argTypes = mi.GetGenericArguments();" 正在返回 0 维,我认为是因为我的方法不是通用的,请提出另一种方法
  • @MKS - 好吧,我想我明白了。我正在使用MethodInfo.GetParameters() 方法来检索参数。我还添加了一些代码来打印更漂亮的结果。
【解决方案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;
    }
}

【讨论】:

  • 感谢@brak,我非常了解这些步骤,我正在研究如何编写代码以从参数中获取值,然后将这些值传递给 webmethod
  • 好的,添加了有关如何处理参数的更多详细信息。
【解决方案3】:

大多数版本的 Visual Studio(如果您正在使用的话)将允许您创建 Web 参考,它会生成所有代码以使用 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 或更高版本。

【讨论】:

  • 我使用的是 .NET 2.0,所以我假设上面的代码示例将在其中完美运行,还有一件事,如何在控制台上打印 webmethods 生成的结果
【解决方案4】:

听起来您需要为服务添加网络引用。您可以使用 if 语句将参数与某些方法名称进行比较并调用它们,也可以使用反射来查找和执行方法。

我确实知道在代码中使用可能出现在服务中的新方法自动更新 Web 引用的方法,因为添加 Web 引用会创建编译到您的应用程序中的代码,但您可以自己解析 wsdl 并创建肥皂请求并使用 HttpWebRequest 发送。

【讨论】:

  • 能否请您提供一些示例代码!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多