7

この実用的な Haskell の例は、F# 型プロバイダーを使用するために Visual Studio 2012 試用版をインストールするように促しました。ただし、その問題を解決するためにそれを使用する方法については完全に困惑しています。RCSB SOAP Web サービスがあります。RCSB からの WSDL Web サービスの URL を使用して、例(Web サービス API が変更されたため機能しません)をコピーしました。

open Microsoft.FSharp.Data.TypeProviders

type pdb = WsdlService<"http://www.rcsb.org/pdb/services/pdbws?wsdl">

do
    let ws = pdb.Getpdbws()
    ws.getCurrentPdbIds()
    |> printfn "%A"

しかし、これは実行時にエラーでクラッシュします:

Unhandled Exception: System.InvalidOperationException: RPC Message blastPDBRequest1 in operation blastPDB1 has an invalid body name blastPDB. It must be blastPDB1
   at System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.OperationReflector.EnsureMessageInfos()
   at System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.EnsureMessageInfos()
   at System.ServiceModel.Description.XmlSerializerOperationBehavior.CreateFormatter()
   at System.ServiceModel.Description.XmlSerializerOperationBehavior.System.ServiceModel.Description.IOperationBehavior.ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
   at System.ServiceModel.Description.DispatcherBuilder.BindOperations(ContractDescription contract, ClientRuntime proxy, DispatchRuntime dispatch)
   at System.ServiceModel.Description.DispatcherBuilder.ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime clientRuntime)
   at System.ServiceModel.Description.DispatcherBuilder.BuildProxyBehavior(ServiceEndpoint serviceEndpoint, BindingParameterCollection& parameters)
   at System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory(ServiceEndpoint serviceEndpoint, Boolean useActiveAutoClose)
   at System.ServiceModel.ChannelFactory.CreateFactory()
   at System.ServiceModel.ChannelFactory.OnOpening()
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.ChannelFactory.EnsureOpened()
   at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via)
   at System.ServiceModel.ChannelFactory`1.CreateChannel()
   at System.ServiceModel.ClientBase`1.CreateChannel()
   at System.ServiceModel.ClientBase`1.CreateChannelInternal()
   at System.ServiceModel.ClientBase`1.get_Channel()
   at Program.pdb.ServiceTypes.PdbWebServiceClient.getCurrentPdbIds()
   at Program.pdb.ServiceTypes.SimpleDataContextTypes.PdbWebServiceClient.getCurrentPdbIds()
   at <StartupCode$ConsoleApplication2>.$Program.main@() in c:\users\jon\documents\visual studio 11\Projects\ConsoleApplication2\ConsoleApplication2\Program.fs: line 5

また、SOAP Web サービスは非推奨になり、RESTfulなサービスが優先されます。F# 3.0 からどのように使用できますか? 最も単純な作業例はどのように見えますか?

4

1 に答える 1

7

操作BlastPDBがオーバーロードされているように見えますが、TypeProvider によって使用される基になる生成コードはそれを適切にサポートしていません (ボディ名に「1」を付けていません)。Svcutilを直接使用する場合の同じ問題については、この回答を参照してください。

私の知る限り、REST サービスはスキーマを提供しないため、Type Provider を使用して REST サービスにアクセスすることはできません (この回答F# Type Providers and REST apisを参照してください)。おそらく、REST クライアント ライブラリ (ここでいくつかのオプションを参照してください.NET Rest Client Frameworks ) にフォールバックするか、生の HTTP を実行する必要があります。

最も単純な作業例はどのように見えますか?

以下は、 List all current PDB IDs REST APIを使用して PDB ID の現在のリストを取得する簡単な例です(これは、Web サービスで試行した呼び出しと同等であると思います)。System.Net.Http への参照を追加する必要があります。

open System.Net.Http
open System.Threading.Tasks

[<EntryPoint>]
let main argv = 

    use httpClient = new HttpClient()
    let task = httpClient.GetStringAsync("http://www.rcsb.org/pdb/rest/getCurrent")
    printfn "%s" task.Result

    0
于 2012-08-19T12:36:50.440 に答える