首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Web服务或Web服务引用

使用Web服务或Web服务引用
EN

Stack Overflow用户
提问于 2009-07-29 18:14:47
回答 3查看 11.1K关注 0票数 2

这与.NET有关。我决定使用Web引用而不是Web……我认为下面的问题实际上是针对这两种情况的,我想试着了解这方面的总体情况。

,这是我的问题,,让我先解释一下我来自哪里。在过去的一个项目中,我以前通过创建手动类(例如GetPicturesRequest.cs和GetPicturesResponse.cs )来与几个API进行过交谈,这些类可以为我保存状态。我有一个名为Request.cs的基类,用于实际发送api调用:

代码语言:javascript
复制
Stream requestStream;
Stream responseStream;
XmlDocument doc = new XmlDocument();
doc = CreateRequestXML();

// Determins if API call needs to use a session based URI
string requestURI = UseAuthURI == true ? _requestURIAuthBased + JSessionID : _requestURI;

byte[] data = XmlUtil.DocumentToBytes(doc);

// Create the atual Request instance
HttpWebRequest request = CreateWebRequest(requestURI, data.Length);
request.ContentLength = data.Length;
request.KeepAlive = false;
request.Timeout = 30000;

// Send the Request
requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();

现在,我想使用一个Web服务引用。因此,我在VS 2008中指出并创建了一个对https://www.sandbox.paypal.com/wsdl/PayPalSvc.wsdl的新引用。现在我有了一个Web引用。

现在,作为web服务的第一次用户,我有了这些问题,而不是像使用第三方API那样手工操作:

1)如何指定标头参数?例如,一些API要求您发送散列(签名)、sessionID、用户名、密码,并将其命名为API方法调用请求。如何使用web服务代理类来指定这一点?

2)请求/响应对象是如何处理的,或者我现在使用的是web服务/引用,不需要担心这个问题吗?我的意思是,是否仍然需要创建请求对象,以及如何接收响应?

3)当我接收到响应时,代理类是否包含它的状态,还是在使用服务/引用时还必须创建一个类来保存从API方法调用响应返回的数据的状态?

4)如果我想要像以前一样创建自定义代码,而不是使用web服务/引用选项来创建我自己的代理类、请求对象、响应对象和所有东西,会这样做吗?而不是让VS提出一个基于WSDL的Web引用?是不是因为它不是一个基于SOAP的第三方API?是因为第三方API没有提供WSDL,所以您不得不自己编写包装器代码吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-29 19:08:28

这里很混乱。请大家停下!

WSE已经过时了。别用它。

"Web引用“与旧的ASMX web服务技术有关。微软现在认为它是“遗留”代码,并已停止修复bug。如果你不需要的话,不要用它。

OP应该使用“”。我刚试过了,成功了。

现在,关于你们的问题:

  1. 如何指定标头参数? 由于此服务使用标头,代理类已生成为消息契约,其中可以包含头部分和正文部分。例如,RefundTransactionRequest类具有一个CustomSecurityHeaderType类型的RequesterCredentials属性。您只需在发送请求之前设置它。实际上,它为RefundTransactionRequest生成了一个构造函数,它同时将头和正文作为参数,所以这很容易。
  2. 请求/响应对象是如何处理的? 除了创建类的实例和调用方法之外,您不需要做任何事情。所有的序列化都是为您完成的。所有的类创建都是为您完成的。
  3. 当我收到响应时,代理类是否包含它的状态? 是。代理类将包含所有消息头和正文部分。当然,只有在有输出头的情况下才会有标题部分。
  4. 什么时候我会像以前一样只想创建自定义代码,而不是在WSDL中使用web服务/引用选项? 我想永远不会。我从来没见过这么做的理由。我想唯一的时间将是如果有一个错误在“添加服务引用”。

示例:

代码语言:javascript
复制
using (var svc = new PayPalAPIAAInterfaceClient())
{
    var paypal = (PayPalAPIInterface) svc;
    var credentials = new CustomSecurityHeaderType
                          {
                              Credentials =
                                  new UserIdPasswordType
                                      {
                                          AppId = "",
                                          Username = "John",
                                          Password = "John"
                                      }
                          };
    var request = new RefundTransactionRequestType
                      {
                          Amount =
                              new BasicAmountType
                                  {
                                      currencyID = CurrencyCodeType.USD,
                                      Value = "100.00"
                                  },
                          Memo = "I want my money back",
                          RefundType = RefundType.Full,
                          RefundTypeSpecified = true
                      };
    var refundRequest = new RefundTransactionReq
                            {RefundTransactionRequest = request};
    var result =
        paypal.RefundTransaction(
            new RefundTransactionRequest(credentials, refundRequest));
    var response = result.RefundTransactionResponse1;
    var returnedCredentials = result.RequesterCredentials;
}
票数 9
EN

Stack Overflow用户

发布于 2009-07-29 18:54:44

我假设你使用的是一个网络参考。在大多数情况下,使用web服务应该像使用本地对象一样容易。.NET处理被盖下的所有管道。有时效果很好--其他时候就不太好了。

当您向PayPal web服务添加web引用时,Visual将在名为reference.cs的Web引用的子文件夹中创建一个文件,该子文件夹是代理类(默认情况下VS 2008会隐藏它--您必须“显示所有文件”才能看到它)。

对于您的具体情况,PayPal似乎使用自定义SOAP头来传输所有安全上下文信息。有关更多细节,请查看CustomSecurityHeaderType和UserIdPasswordType类型。另外,来自PayPal的一些文档可能会有所帮助。:)

要使用该服务,您必须执行如下操作:

代码语言:javascript
复制
    PayPalAPISoapBinding payPal = new PayPalAPISoapBinding();

    CustomSecurityHeaderType customSecurity = new CustomSecurityHeaderType();
    customSecurity.eBayAuthToken = "The Auth Token";

    UserIdPasswordType userId = new UserIdPasswordType();
    userId.Password = "PWD";
    userId.Username = "JIMMY";

    customSecurity.Credentials = userId;

    payPal.RequesterCredentials = customSecurity;

    RefundTransactionReq request = new RefundTransactionReq();

    RefundTransactionResponseType response = payPal.RefundTransaction(request); 

我不熟悉PayPal服务,但我认为这就是它的工作方式。

票数 2
EN

Stack Overflow用户

发布于 2009-07-29 18:43:37

1)在您的情况下,用户名和密码是在soap头中传输的。您将需要安装WSE 3.0,在VS项目中激活它,并再次生成代理。

2)请求创建和响应解析是由WSE内部进行的。只需创建代理、设置标头并调用代理上的方法即可。

3)应该有很强的理由创建自定义代理实现。WSE涵盖SOAP场景和WS-*规范的一部分。除了SOAP之外,WCF还包括TCP、管道和MSMQ传输。即使服务不提供WSDL,您仍然可以自己指定契约,让框架来完成传输工作。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1202074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档