我的公司在其中一台服务器上托管一个 SOAP 网络服务,并且要求使用该网络服务直接从我正在开发的网络前端创建“任务”。我可以访问 WSDL。
网络服务文档指出我必须:
<强>1。调用LoginSI,提供用户名和密码进行鉴权, 结果收到 SessionId
<强>2。对 WebService 执行任意数量的方法调用,传入 SessionId
<强>3。调用 LogoutSI,传入 SessionId。这将放弃之前的 session 与LoginSI建立
这听起来很合理,我已经设法调用 LoginSI 网络服务并使用以下简单的 HTML 表单检索 SessionID:
<form action="http://webservice_server/webservice.asmx/LoginSI" method="post">
<p>
Username:<br />
<input type="text" name="username"/>
</p>
<p>
Password:<br />
<input type="password" name="password"/>
</p>
<input type="submit" value="Test login"/>
</form>
到目前为止一切顺利。下一步是开始执行其他 web 服务。但是,我想要的是从同一页面(最初)执行所有这些操作。例如,一旦您成功登录,代码隐藏将处理网络服务响应并获取您的 session ID。然后页面上会出现一些其他选项,然后每次对网络服务的后续调用都将使用 session ID。
我不知道如何纯粹从代码隐藏(或以任何其他方式实现所需行为)使用网络服务。我找到了一些文章,但它们大多提到了向项目添加程序集引用,我认为我无法做到这一点,因为我自己没有编写 web 服务。
谁能指导我正确的方向?
最佳答案
我将从您提到的关于无法引用 web 服务的项目程序集的最后一点开始回答...您不必。
要为该网络服务创建强类型代理,您只需使用网络应用程序中的添加服务引用选项即可。代理(这是一个常规的 C# 类)是一个 soapclient,它将公开所有 web 服务方法,供您从 aspx 页面的代码后面访问。
现在的挑战是保留从 Web 服务返回给您的 SessionId,因为您有多种选择,Sessions、ViewState、QueryString...所以您可以选择。
当然,另一种可能性是 Web 服务是以 RESTful 方式实现的,这意味着没有允许创建强类型代理的 wsdl 文件。在这种情况下,您可以使用 WebClient 类手动创建代理和服务方法,例如:
WebClient proxy = new WebClient();
byte[] data = proxy.DownloadDataAsync("RESTful Method Uri");
希望这有帮助..
关于c# - 纯粹从 aspx 页面使用 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258907/