如何从 .net 控制台应用程序使用本地 asmx Web 服务

How to consume local asmx web service from .net console application

提问人:Ali Kocak 提问时间:7/4/2023 最后编辑:Ali Kocak 更新时间:7/4/2023 访问量:100

问:

我正在尝试学习 Web 服务。我从基本模板 .asmx 开始。然后,我创建了一个 .net 控制台应用程序,并添加了对此应用的 Web 引用。它看起来工作正常。但是我不知道如何在控制台中调用此服务并使用其方法。

SoapDemo.asmx.cs :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace soapdemo
{
    /// <summary>
    /// Summary description for WebService1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.None)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public int SumOfNums(int FirstNumber, int SecondNumber)
        {
            return FirstNumber + SecondNumber;
        }


        [WebMethod(MessageName = "SumOfFloats")]

        public float SumOfNums(float FirstNumber, float SecondNumber)
        {
            return FirstNumber + SecondNumber;
        }
    }
}

程序.cs :

using SoapDemo;
namespace ConsoleClient3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            WebService1SoapClient client = new WebService1SoapClient();
            
            //var add = client.HelloWorldAsync();
            //Console.WriteLine(add);
            //Console.ReadLine();

        }
    }
}

连接服务控制台应用:

Connected Services Console App

enter image description here

C# .NET Web 服务 控制台应用程序 ASMX

评论

0赞 Panagiotis Kanavos 7/4/2023
为什么选择ASMX?这是在创建大多数 WS-* 规范之前构建的 SOAP 服务的旧堆栈。它在 2006 年被 WCF 取代,WCF 确实实现了规范。您使用的堆栈已过期 17 年。这意味着它已经解决了一些已知的问题,而这些问题正是因为它太旧了而没有得到解决
0赞 Ali Kocak 7/4/2023
@PanagiotisKanavos 我目前是一名实习生。我的经理让我用肥皂 asmx 做一个应用程序,用 wcf 做一个应用程序。所以我目前正在尝试使用 asmx 创建一个。最后,我将使用 REST 结构进行编写。

答:

1赞 Kiran Shahi 7/4/2023 #1

我希望您已将项目中的服务引用添加到客户端应用程序中。如果没有,请按照以下步骤进行添加。

  1. 右键单击客户端项目。
  2. 选择“添加”
  3. 选择服务引用。(将出现“添加服务引用”对话框。Add service reference dialog
  4. 选择“WCF Web 服务”,然后单击“下一步”。
  5. 在 URI 输入中添加服务的 URI,然后单击下一步。Add new WCF Web Service service reference dialog
  6. 单击“下一步”enter image description here
  7. 单击“完成”enter image description here

这样,您就已将对服务的引用添加到客户端控制台应用程序。

将服务引用添加到客户端应用后,可以访问服务的 HelloWorld 方法,如下所示:

using ServiceReference1;

namespace ConsoleClient3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            WebService1SoapClient client = new(WebService1SoapClient.EndpointConfiguration.WebService1Soap);

            HelloWorldResponse result = client.HelloWorldAsync().Result;
           

            //var add = client.HelloWorldAsync();
            Console.WriteLine(result.Body.HelloWorldResult);
            //Console.ReadLine();
        }
    }
}

您得到的 hello world 结果为 。检查响应类型并生成该对象。HelloWorldResponse

Preview of result on asmx client console application.

同样,要调用方法,请遵循以下示例SumOfNums

using ServiceReference1;

namespace ConsoleClient3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            WebService1SoapClient client = new(WebService1SoapClient.EndpointConfiguration.WebService1Soap);

            int result = client.SumOfNumsAsync(1, 2).Result;

            Console.WriteLine(result);
        }
    }
}

这里,返回类型是 int,因此您可以直接将其打印为结果。

Sum result from asmx service in console client applicaiton.

作为参考,asmx Web 服务代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebApplication1
{
    /// <summary>
    /// Summary description for WebService1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
        [WebMethod]
        public int SumOfNums(int FirstNumber, int SecondNumber)
        {
            return FirstNumber + SecondNumber;
        }

    }
}

上述代码和操作在 Visual Studio Enterprise 2022 上执行。ASMX Web 服务项目位于 .NET Framework 4.7.2 上,控制台应用程序位于 .NET 7.0 上

评论

0赞 Ali Kocak 7/4/2023
当我写“WebService1SoapClient client = new WebService1SoapClient();
0赞 Ali Kocak 7/4/2023
它没有看到 HelloWorld 方法只得到 HellowWorldAsync,当我打印出来时,我得到“System.Threading.Tasks.Task'1[SoapDemoReference.HelloWorldResponse]”
0赞 Ali Kocak 7/4/2023
它在连接 Web 服务时自动发生。它位于 EndpointConfiguration 下。我正在更新屏幕截图,该屏幕截图在屏幕截图中不完全可见。
0赞 Ali Kocak 7/4/2023
WebService1SoapClient 客户端 = new(new BasicHttpBinding(BasicHttpSecurityMode.None), new EndpointAddress(“localhost:44380/WebService1.asmx”));当我使用它时,它会给出一个 https http 错误。我有 WebService1SoapClient client = new WebService1SoapClient(WebService1SoapClient.EndpointConfiguration.WebService1Soap);所以我用了这个。然后,当我运行应用程序时,它返回了 HelloWorldResponse,但没有返回它应该编写的 hello world。
1赞 Kiran Shahi 7/4/2023
@AliKocak我已经更新了它:)