【问题标题】:How to call a Web Service Method?如何调用 Web 服务方法?
【发布时间】:2010-11-16 12:23:55
【问题描述】:

我有一个包含此方法的网络服务:

[WebMethod]
public static List<string> GetFileListOnWebServer()
{
   DirectoryInfo dInfo = new DirectoryInfo(HostingEnvironment.MapPath("~/UploadedFiles/"));
   FileInfo[] fInfo = dInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly);

   List<string> listFilenames = new List<string>(fInfo.Length);

   for(int i = 0; i < fInfo.Length; i++)
   {
        listFilenames.Add(fInfo[i].Name);
   }

   return listFilenames;
}

这将返回文件夹中的文件名列表。当我调试应用程序时,它工作正常。

我想做的是从一个winform应用程序调用这个webservice方法。我添加了对 webservice 的 .dll 的引用,这就是我调用上述方法的方式:

private void Form1_Load(object sender, EventArgs e)
{
    List<string> files = TestUploaderWebService.Service1.GetFileListOnWebServer();
}

上面的代码不起作用 - 当它进入方法时,Web应用程序的路径为空,并且HostingEnvironment类的许多属性也为空。尝试从另一个 winform 应用调用 Web 服务方法时,我的错误在哪里?

请注意,Web 服务是用 Visual Web Developer Express 制作的,而 winform 是用 Visual C# express 制作的;这就是为什么我必须在 winform 应用程序中添加 Web 服务 dll 作为参考。我没有完整的 Visual Studio,这将允许我使用两个项目的单一解决方案。

我是网络服务的新手。

PS - 我喜欢这里的动态文本格式:)

【问题讨论】:

    标签: c# winforms web-services


    【解决方案1】:

    在 Visual Studio 中,使用“添加 Web 引用”功能,然后输入您的 Web 服务的 URL。

    通过添加对 DLL 的引用,您不会将其引用为 Web 服务,而只是作为一个程序集。

    当您添加 Web 引用时,它会在您的项目中创建一个代理类,该类具有与您的 Web 服务相同或相似的方法/参数。该代理类通过 SOAP 与您的 Web 服务通信,但隐藏了所有通信协议内容,因此您不必担心。

    【讨论】:

    • 太棒了——非常感谢!我现在已经删除了 dll ref ,并添加了对 URL 的服务引用。然而,我注意到它并没有让我直接访问我的方法,而是访问名为:GetFileListOnWebServerRequest、GetFileListOnWebServerRequestBody、GetFileListOnWebServerResponse、GetFileListOnWebServerResponseBody 的类。关于这些自动生成的类,我可以阅读任何网络资源吗?我不知道如何使用这些。
    • 它会生成很多部分,但只需查找 GetFileListOnWebServer 方法本身。
    • 其实看看约翰的例子就知道了。
    • 糟糕,抱歉,我自己回答了 - 只需要选择 Web 服务而不是服务参考。我认为你的帖子很有帮助,但我还不能。和平!
    【解决方案2】:

    当前执行此操作的方法是使用“添加服务引用”命令。如果将“TestUploaderWebService”指定为服务引用名称,则会生成类型TestUploaderWebService.Service1。该类将有一个名为GetFileListOnWebServer 的方法,它将返回一个字符串数组(如果您愿意,可以将其更改为字符串列表)。你可以这样使用它:

    string[] files = null;
    TestUploaderWebService.Service1 proxy = null;
    bool success = false;
    try
    {
        proxy = new TestUploaderWebService.Service1();
        files = proxy.GetFileListOnWebServer();
        proxy.Close();
        success = true;
    }
    finally
    {
        if (!success)
        {
            proxy.Abort();
        }
    }
    

    附:告诉你的老师看看“Microsoft: ASMX Web Services are a “Legacy Technology””,问他为什么教过时的技术。

    【讨论】:

    • @John Saunders 使用上面的代码和网络参考,是否可以添加自定义标题?
    • @Cornelis 那,还有更多。查找“WCF 自定义标头”。例如,codeproject.com/Articles/352678/…
    【解决方案3】:

    当然,James 的回答是正确的,但我应该提醒您,整个 ASMX 的东西,即使不是过时的,至少不是当前的方法。我强烈建议您研究 WCF,即使只是为了避免学习您需要忘记的东西。

    【讨论】:

    • 感谢您的回答,史蒂文!我一定会研究 WCF。然而,至于这个任务,它是一个“家庭作业”,所以我被告知使用 asmx :) 干杯!
    • 好的,但如果是家庭作业,请标记它。我冒昧地为你做这件事。
    【解决方案4】:

    在第一个方法中写入return(secondmethod)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多