这与.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)如果我想要像以前一样创建自定义代码,而不是使用web服务/引用选项来创建我自己的代理类、请求对象、响应对象和所有东西,会这样做吗?而不是让VS提出一个基于WSDL的Web引用?是不是因为它不是一个基于SOAP的第三方API?是因为第三方API没有提供WSDL,所以您不得不自己编写包装器代码吗?
发布于 2009-07-29 19:08:28
这里很混乱。请大家停下!
WSE已经过时了。别用它。
"Web引用“与旧的ASMX web服务技术有关。微软现在认为它是“遗留”代码,并已停止修复bug。如果你不需要的话,不要用它。
OP应该使用“”。我刚试过了,成功了。
现在,关于你们的问题:
RefundTransactionRequest类具有一个CustomSecurityHeaderType类型的RequesterCredentials属性。您只需在发送请求之前设置它。实际上,它为RefundTransactionRequest生成了一个构造函数,它同时将头和正文作为参数,所以这很容易。示例:
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;
}发布于 2009-07-29 18:54:44
我假设你使用的是一个网络参考。在大多数情况下,使用web服务应该像使用本地对象一样容易。.NET处理被盖下的所有管道。有时效果很好--其他时候就不太好了。
当您向PayPal web服务添加web引用时,Visual将在名为reference.cs的Web引用的子文件夹中创建一个文件,该子文件夹是代理类(默认情况下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服务,但我认为这就是它的工作方式。
发布于 2009-07-29 18:43:37
1)在您的情况下,用户名和密码是在soap头中传输的。您将需要安装WSE 3.0,在VS项目中激活它,并再次生成代理。
2)请求创建和响应解析是由WSE内部进行的。只需创建代理、设置标头并调用代理上的方法即可。
3)应该有很强的理由创建自定义代理实现。WSE涵盖SOAP场景和WS-*规范的一部分。除了SOAP之外,WCF还包括TCP、管道和MSMQ传输。即使服务不提供WSDL,您仍然可以自己指定契约,让框架来完成传输工作。
https://stackoverflow.com/questions/1202074
复制相似问题