Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建c控制台应用程序来消费.net Web服务_C# - Fatal编程技术网

C# 如何创建c控制台应用程序来消费.net Web服务

C# 如何创建c控制台应用程序来消费.net Web服务,c#,C#,我希望创建C控制台应用程序,它将使用我想要的Web服务http://localhost/MyService/MyService.asmx. 我的控制台应用程序将使用上面的webservice并在其中调用web方法,我更喜欢将控制台窗口中的值作为参数传递,比如说,如果有来自名称MyDetails的web方法,那么从控制台应用程序中,如果我传递admin及其密码,它将在控制台窗口中给出结果 例如,如果我尝试从控制台窗口运行,如下所示: 运行>>myconsoleseservice.exe MyDet

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

我的控制台应用程序将使用上面的webservice并在其中调用web方法,我更喜欢将控制台窗口中的值作为参数传递,比如说,如果有来自名称MyDetails的web方法,那么从控制台应用程序中,如果我传递admin及其密码,它将在控制台窗口中给出结果

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

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

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

谢谢


致以最诚挚的问候,

右键单击项目中的引用,然后选择“添加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;
    }
}
我的尝试

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

如果您使用的是Visual Studio的大多数版本,那么它将允许您创建一个Web引用,该引用将生成使用Web服务的所有代码

至于根据命令行中的参数调用方法,您需要使用反射。见下文:

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

请注意,只有当所有参数都是字符串时,这才有效。如果要使用其他类型调用方法,则必须以某种方式将输入字符串转换为正确的类型。此外,这是C3或更高版本。

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


我知道有一种方法可以在代码中使用服务中可能出现的新方法自动更新web引用,因为添加web引用会创建编译到应用程序中的代码,但是您可以自己解析wsdl并创建soap请求,然后使用HttpWebRequest发送它。

问题是什么?伙计们,我想创建使用我的web服务的控制台应用程序,然后从控制台窗口,我将参数传递给web方法,它将返回相应的结果以供澄清。。。管理员和密码是windows凭据吗?或者它们是MyDetails方法的参数?@dana它们是webmethod MyDetails的参数,在上面我只给出了两个参数,但是参数列表可以更多,所以我希望创建更多的通用代码,这样我就可以使用任何webservice和其中的任何方法,只需要从控制台传递参数。谢谢@brak,我非常了解这些步骤,我正在研究如何编写代码从参数中获取值,然后将这些值传递给webmethodok,添加了有关如何处理参数的更多详细信息。@谢谢dana,所以请打印s.MyMethod生成的结果;在控制台窗口上,我们只需要获取所有值并使用console.print,这样我们就可以在控制台窗口上看到结果itself@Dana,我们使用s的原因。凭据=新网络凭据用户名,密码;由于这些用户名和密码是我的web方法的参数,而且这些参数也可以是动态的,所以需要更通用的code@MKS-对不起。我对这个问题感到困惑,并更新了代码,以便对调用的方法使用动态参数。@Dana this line Type[]argTypes=mi.GetGenericArguments;正在返回0维,我认为因为我的方法不是通用的,请建议另一种方法way@MKS-好的,我想我明白了。我正在使用MethodInfo.GetParameters方法检索参数。我还添加了一些代码来打印更漂亮的结果。你能用一些示例代码来建议吗!我使用的是.NET2.0,所以我假设上面的代码示例将在其中完美工作,还有一件事,如何在控制台上打印webmethods生成的结果