eBay C#SDK不适用于Mono

我下载了eBay SDK,用于我们正在开发的内部应用程序。 我们正在开发Mono。 当我在.NET上运行eBay Hello World示例时,它显示以下输出:

+++++++++++++++++++++++++++++++++++++++ + Welcome to eBay SDK for .Net Sample + + - HelloWorld + +++++++++++++++++++++++++++++++++++++++ Begin to call eBay API, please wait ... End to call eBay API, show call result: eBay official Time: 11/27/2013 3:02:19 PM 

当我使用Mono运行它时,我得到以下内容:

 Unhandled Exception: eBay.Service.Core.Sdk.ApiException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: WebServiceBindingAttribute is required on proxy class 'eBay.Service.Core.Sdk.eBayAPIInterfaceService2'. at System.Web.Services.Protocols.SoapTypeStubInfo..ctor (System.Web.Services.Protocols.LogicalTypeInfo logicalTypeInfo) [0x00000] at (wrapper managed-to-native) System.Reflection.MonoCMethod:InternalInvoke (object,object[],System.Exception&) etc...etc...etc... 

我找到了一个解决方法,并将其发布在下面的答案中。

我搜索了Xamarin的Bugzilla并没有发现任何内容,但我在Novell的旧Mono Bugzilla中发现了相关的错误: https ://bugzilla.novell.com/show_bug.cgi ? id = 693367

所以我挖掘了e​​Bay SDK源代码,发现这确实是个问题。 eBay.Service.Core.Sdk.eBayAPIInterfaceService2inheritance自eBay.Service.Core.Sdk.eBayAPIInterfaceService ,后者使用System.Web.Services.WebServiceBindingAttribute修饰。

所以我改变了eBay.Service.Core.Sdk.eBayAPIInterfaceService2 ,添加了[System.Web.Services.WebServiceBindingAttribute(Name = "eBayAPISoapBinding", Namespace = "urn:ebay:apis:eBLBaseComponents")] ,现在它看起来如下所示:

 using System; using System.Net; using eBay.Service.Core.Soap; namespace eBay.Service.Core.Sdk { ///  /// Enhanced eBayAPIInterfaceService with GZIP compression support. ///  [System.Web.Services.WebServiceBindingAttribute(Name = "eBayAPISoapBinding", Namespace = "urn:ebay:apis:eBLBaseComponents")] internal class eBayAPIInterfaceService2 : eBayAPIInterfaceService { ... } } 

我按照eBay SDK中的说明从源代码构建,问题解决了。


脚注 :顺便说一句,如果这是您第一次使用Mono连接到HTTPS Web服务,则可能会立即遇到另一个exception。 那个看起来像这样:

 Unhandled Exception: System.Net.WebException: Error getting response stream (Write: The authentication or decryption has failed.): SendFailure ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server. Error code: 0xffffffff800b010a at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000] in :0 at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1 () [0x00000] in :0 at Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process () [0x00000] in :0 at (wrapper remoting-invoke-with-check) Mono.Security.Protocol.Tls.Handshake.HandshakeMessage:Process () at Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage (Mono.Security.Protocol.Tls.TlsStream handMsg) [0x00000] in :0 at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IAsyncResult asyncResult) [0x00000] in :0 --- End of inner exception stack trace --- at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) [0x00000] in :0 --- End of inner exception stack trace --- at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in :0 at System.Net.HttpWebRequest.GetResponse () [0x00000] in :0 

要解决这个问题,请访问: http : //www.mono-project.com/FAQ : _Security