这与.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,那么你不得不亲自手工编写包装器代码?
答案 0 :(得分:9)
这里存在严重的混淆。大家请停下来!
WSE已经过时了。不要使用它。
“Web引用”与旧的ASMX Web服务技术相关。微软现在认为它是“遗留”代码,并已停止修复错误。如果您不需要,请不要使用它。
OP应使用“添加服务引用”。我只是尝试过它,它起作用了。
现在,问题:
如何指定标题参数?
由于此服务使用标头,因此代理类已生成为消息合同,消息合同可以包含标题部分和正文部分。例如,RefundTransactionRequest
类具有RequesterCredentials
属性,属于CustomSecurityHeaderType
类型。您只需在发送请求之前设置它。事实上,它已经为RefundTransactionRequest
生成了一个构造函数,它将标题和正文都作为参数,因此这很容易。
如何处理请求/响应对象?
除了创建类的实例和调用方法之外,您不必执行任何操作。所有序列化都是为您完成的。所有的课程创作都是为你完成的。
当我收到响应时,Proxy类是否包含其状态?
是。代理类将包含所有邮件头和正文部分。当然,如果有输出标题,则只有标题部分。
我什么时候只想创建自定义代码,而不是像以前那样使用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;
}
答案 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,您仍然可以自己指定合同并让框架进行传输工作。