2

組み込みのWSDLタイププロバイダーを使用して次のF#3.0プログラムを作成し、Amazon WSDLのF#バージョンを自動生成しました。

open Microsoft.FSharp.Data.TypeProviders

type azn = WsdlService<"http://soap.amazon.com/schemas2/AmazonWebServices.wsdl">

let authorRequest author =
    azn.ServiceTypes.AuthorRequest(author=author)

do
    let client = azn.GetAmazonSearchPort()
    let response = client.AuthorSearchRequest(authorRequest "Harrop")
    printfn "%s" response.TotalResults

これを実行すると、実行時にMicrosoftツールスタックからエキサイティングな内部例外が発生します。

Unhandled Exception: System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (410) Gone. ---> System.Net.WebException: The remote server returned an error: (410) Gone.
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   --- End of inner exception stack trace ---

Server stack trace:
   at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory`1 factory, WebException responseException, ChannelBinding channelBinding)
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at Program.azn.ServiceTypes.AmazonSearchPort.AuthorSearchRequest(AuthorRequest AuthorSearchRequest1)
   at Program.azn.ServiceTypes.AmazonSearchPortClient.AuthorSearchRequest(AuthorRequest AuthorSearchRequest1)
   at Program.azn.ServiceTypes.SimpleDataContextTypes.AmazonSearchPortClient.AuthorSearchRequest(AuthorRequest )
   at <StartupCode$ConsoleApplication2>.$Program.main@() in c:\users\jon\documents\visual studio 11\Projects\ConsoleApplication2\ConsoleApplication2\Program.fs:line 5

それ以来、ここにもっと最近のスキーマがあることがわかりました。

type azn = WsdlService<"http://soap.amazon.com/schemas2/AmazonWebServices.wsdl">

しかし、これは私のエキサイティングなエラーメッセージを修正しません。問題は何ですか?どうすれば修正できますか?

4

1 に答える 1

3

エンドツーエンドのソリューションはわかりませんが、おそらくもう少し先に進むのに役立ちます

現在使用しているURLは、古いバージョンのAPIに対応しています。最近のものはhttp://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdlだと思います。

このURLをWsdlServiceタイププロバイダーに渡すだけで、デザイン時にはすべて問題なく動作しますが、実行時に「メッセージの本文にエラーが発生しましたItemSearchRequest1:」のような奇妙なエラーが発生します。'一時クラスを生成できません(result = 1 )。エラーCS0030:タイプ'Program.Amazon.ServiceTypes.ImageSet[]'を'Program.Amazon.ServiceTypes.ImageSet'に変換できません;エラーCS0029:タイプ'Program.Amazon.ServiceTypes.ImageSet'を'プログラムに暗黙的に変換できません。 Amazon.ServiceTypes.ImageSet[]' "。

既知のエラー(ここ)のようです。修正するには、ForceUpdate = false、LocalSchemaFile ='ローカルスキーマファイル'を設定してから、ローカルスキーマファイルのImagesSetの定義を修正する必要があります。

<xs:element minOccurs="0" maxOccurs="unbounded" name="ImageSets">

<xs:element minOccurs="0" maxOccurs="1" name="ImageSets">

type Amazon = Microsoft.FSharp.Data.TypeProviders.WsdlService<
                @"http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl", 
                ForceUpdate=false, 
                LocalSchemaFile="amazon.wsdlschema"
                >

let searchAuthor author = 
    Amazon.ServiceTypes.ItemSearch(Request = [| Amazon.ServiceTypes.ItemSearchRequest(Author = author) |])

[<EntryPoint>]
let main argv = 
    let amazon = Amazon.GetAWSECommerceServicePort()
    let result = amazon.ItemSearch (searchAuthor "Harrop")
    0  

ただし、これで話は終わりではありません。このコードはMessageSecurityExceptionをスローします:「HTTPリクエストはクライアント認証スキーム「匿名」で禁止されました」。既知の問題(つまりここ)のようにも見えますが、解決策を確認するには、AmazonユーザーIDと秘密鍵が必要です(私は持っていません)。

于 2012-08-19T16:03:46.877 に答える