使用Web服务或Web服务参考

Pos*_*Guy 2 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();
Run Code Online (Sandbox Code Playgroud)

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

我现在有这些问题作为第一次使用Web服务而不是手动操作,因为我使用的是第三方API:

1)如何指定标题参数?例如,某些API要求您发送散列(签名),sessionID,用户名,密码,并将其与API方法调用请求一起命名.如何使用Web服务代理类指定它?

2)如何处理请求/响应对象或者我现在不需要担心这是因为我正在使用Web服务/引用?我的意思是我还需要创建一个请求对象,我将如何收到响应?

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

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

Joh*_*ers 9

这里有很严重的混乱.大家请停下来!

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

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

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


现在,问你的问题:

  1. 如何指定标题参数?

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

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

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

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

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

  4. 我什么时候想要像以前一样创建自定义代码而不是使用WSDL的web服务/引用选项?

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


例:

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;
}
Run Code Online (Sandbox Code Playgroud)