2011-07-27 5 views
5

NuGet(pkg version 0.3.0)経由でWCF WebApiスタック(プレビュー4)を使用しています。HttpClientを使用してポストをポストする方法を理解できないようです。次を考えるWCF WebApiのHttpClientでポストをポストする方法

Postメソッドが呼び出されると

Public Class MyInfo 
    Public Property MyDate As DateTime 
    Public Property MyId As Guid 
End Class 

... 
Dim value = New MyInfo With {.MyDate = Today, .MyId = Guid.NewGuid()} 

Using client as New HttpClient(baseUri) 
    Using response = client.Post(requestUri, New ObjectContent(Of MyInfo)(value)) 
     ' Do stuff 
    End Using 
End Using 
... 

、私は次の例外を取得:

The 'XmlSerializer' serializer cannot serialize the type 'MyInfo'. 

at Microsoft.ApplicationServer.Http.XmlMediaTypeFormatter.GetSerializerForType(Type type) 
at Microsoft.ApplicationServer.Http.XmlMediaTypeFormatter.OnWriteToStream(Type type, Object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext context) 
at Microsoft.ApplicationServer.Http.MediaTypeFormatter.WriteToStream(Type type, Object instance, Stream stream, HttpContentHeaders contentHeaders, TransportContext context) 
at Microsoft.ApplicationServer.Http.ObjectContent.WriteToStreamInternal(Stream stream, TransportContext context) 
at Microsoft.ApplicationServer.Http.ObjectContent.SerializeToStream(Stream stream, TransportContext context) 
at System.Net.Http.HttpContent.LoadIntoBuffer(Int32 maxBufferSize) 
at System.Net.Http.HttpClientChannel.PrepareWebRequestForContentUpload(HttpWebRequest webRequest, HttpRequestMessage request) 
at System.Net.Http.HttpClientChannel.CreateAndPrepareWebRequest(HttpRequestMessage request) 
at System.Net.Http.HttpClientChannel.Send(HttpRequestMessage request, CancellationToken cancellationToken) 
at System.Net.Http.HttpClient.Send(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken) 
at System.Net.Http.HttpClient.Send(HttpRequestMessage request) 
at System.Net.Http.HttpClient.Post(Uri requestUri, HttpContent content) 
at System.Net.Http.HttpClient.Post(String requestUri, HttpContent content) 
... 

これはNuGet 0.3.0パッケージを使用しています。

私は<Serializable()>とさらに<DataContract()>からMyInfoを追加しようとしましたが、それは役に立ちませんでした。私はちょうど何か間違っていますか?

ここでStackOverflowにthis postが見つかりました。誰かが私が上記のようなことをしているように見えます。私は彼の仕事を複製しました(彼のMachineオブジェクトは私のMyInfoのような単純なPOCOだと推測します)、同じ "can not serialize"例外が発生しました。

答えて

5

私は自分自身で問題を見つけることになった。私はメディアタイプが欠けていた。 Postメソッドを次のように変更しました。

Using client as New HttpClient(baseUri) 
    Using response = client.Post(requestUri, New ObjectContent(Of MyInfo)(value, "text/xml")) 
     ' Do stuff 
    End Using 
End Using 

となりました。私はそれが理にかなっていると思う。何らかの理由で、デフォルトのメディアタイプ優先順位が組み込まれているため、毎回メディアタイプを指定する必要がなくなりました。たぶん、ありますが、私はまだ何か間違っていますか?

更新:

私の元の問題は、実際にそれが実際に問題修正/回避策をやっていても、メディアのタイプとは何の関係もありませんでした。この問題は、MyInfoがこのようなModuleの内部にネストされている場合に発生するようです。 MyInfo一度

Module Module1 

    Sub Main() 
     Dim value = New MyInfo With {.MyDate = Today, .MyId = Guid.NewGuid()} 
     Dim payload As HttpContent = New ObjectContent(Of MyInfo)(value) 

     Using client as New HttpClient(baseUri) 
      Using response = client.Post(requestUri, New ObjectContent(Of MyInfo)(value)) 
       ' Do stuff 
      End Using 
     End Using 
    End Sub 

    Public Class MyInfo 
     Public Property MyDate As DateTime 
     Public Property MyId As Guid 
    End Class 

End Module 

Moduleの移動、エラーはもはや起こりません。また、メディアタイプが例外を防止するためにもはや必要とされない間に、メッセージボディの逆シリアル化の方法をサーバが知らないので、サーバサイドを飛行しない可能性があるContent-Typeヘッダがないことに注意してください。私の場合は、メディアタイプをそのままにして、サーバーにはContent-Type: application/xmlヘッダーを含める必要がありました。

+0

"text/xml"でハードコーディングするのではなく、XmlMediaTypeFormatter.DefaultMediaType.MediaType(「application/xml」 - 「より良い」メディアタイプのいずれかです)を使用して終了しました。私はこれをやり直すことを避け、いくつかの正常なデフォルトを取り戻すことができるかどうかを知りたいと思っています。 – ckittel

関連する問題