使用Web服务或Web服务参考

时间:2009-07-29 18:14:47

标签: asp.net web-services

这与.NET有关。我决定使用Web服务参考而不是Web服务...我认为虽然下面的问题确实适用于这两种情况,但我想尝试全面了解这一点。

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

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)我想要的只是像以前一样创建自定义代码而不是使用WSDL的web服务/引用选项?...本质上是创建自己的代理类,请求对象,响应对象,一切?而不是让VS吐出基于WSDL的Web引用?是因为它不是基于SOAP的第三方API吗?是因为第三方API没有提供WSDL,那么你不得不亲自手工编写包装器代码?

3 个答案:

答案 0 :(得分:9)

这里存在严重的混淆。大家请停下来!

WSE已经过时了。不要使用它。

“Web引用”与旧的ASMX Web服务技术相关。微软现在认为它是“遗留”代码,并已停止修复错误。如果您不需要,请不要使用它。

OP应使用“添加服务引用”。我只是尝试过它,它起作用了。


现在,问题:

  1. 如何指定标题参数?

    由于此服务使用标头,因此代理类已生成为消息合同,消息合同可以包含标题部分和正文部分。例如,RefundTransactionRequest类具有RequesterCredentials属性,属于CustomSecurityHeaderType类型。您只需在发送请求之前设置它。事实上,它已经为RefundTransactionRequest生成了一个构造函数,它将标题和正文都作为参数,因此这很容易。

  2. 如何处理请求/响应对象?

    除了创建类的实例和调用方法之外,您不必执行任何操作。所有序列化都是为您完成的。所有的课程创作都是为你完成的。

  3. 当我收到响应时,Proxy类是否包含其状态?

    是。代理类将包含所有邮件头和正文部分。当然,如果有输出标题,则只有标题部分。

  4. 我什么时候只想创建自定义代码,而不是像以前那样使用Web服务/引用选项?

    从来没有,我想。我从未见过这样做的理由。我想唯一的一次是“添加服务参考”中有错误。


  5. 示例:

    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;
    }
    

答案 1 :(得分:2)

我假设你正在使用网络参考。在大多数情况下,使用Web服务应该像使用本地对象一样简单。 .NET负责处理所有管道。有时候这很有效 - 其他时间不是那么多。

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

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

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

    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 :(得分:-2)

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

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

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