如何调用Web服务方法?

23
我有一个包含如下方法的Web服务:
[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应用程序中调用这个web服务方法。我添加了对web服务的.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创建的;这就是为什么我必须将Web服务DLL添加为WinForm应用程序的引用的原因。我没有完整的Visual Studio,否则我将能够拥有一个包含两个项目的单一解决方案。

我对Web服务很新。

PS-我喜欢这里的实时文本格式化:)

4个回答

19
在Visual Studio中,使用“添加Web引用”功能,然后输入您的Web服务的URL。
通过添加对DLL的引用,您将其作为一个程序集而不是作为Web服务进行引用。
当您添加Web引用时,它会在您的项目中创建一个代理类,该类具有与您的Web服务相同或类似的方法/参数。该代理类通过SOAP与您的Web服务通信,但隐藏了所有通信协议内容,因此您无需担心这些细节。

太棒了,非常感谢!我现在已经删除了dll引用,并添加了一个Service Reference到URL。但是我注意到它没有直接访问我的方法,而是可以访问名为GetFileListOnWebServerRequest、GetFileListOnWebServerRequestBody、GetFileListOnWebServerResponse和GetFileListOnWebServerResponseBody的类。有没有网络资源可以阅读这些自动生成的类?我不知道如何使用它们。 - Amc_rtty
它生成了很多部分,但只需查找GetFileListOnWebServer方法本身。 - Steven Sudit
1
其实,只需看约翰的例子。 - Steven Sudit
抱歉,我自己回答了 - 只需要选择Web服务而不是服务引用。我认为你的帖子很有帮助,但我还不能评价。 祝好! - Amc_rtty

12

目前的做法是使用 "添加服务引用" 命令。如果您将服务引用名称指定为 "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();
    }
}

顺便说一下,告诉你的讲师看看“微软: ASMX Web Services 是“遗留技术””,并问问他为什么要教过时的技术。


@John Saunders 使用上述代码和网络引用,是否可以添加自定义标头? - Cornelis
1
@Cornelis,还有更多。查找“WCF自定义标头”。例如,https://www.codeproject.com/Articles/352678/Add-Custom-Message-Header-in-WCF-Calls - John Saunders

1

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


谢谢你的回答,Steven!我一定会研究WCF。但是对于这个任务,它是一个“家庭作业”任务,所以我被告知要使用asmx :)干杯! - Amc_rtty
好的,但如果这是作业,请标记一下。我已经为您做了这件事。 - Steven Sudit

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接