5

NuGet (pkg バージョン 0.3.0) 経由で WCF WebApi スタック (プレビュー 4) を使用していますが、 HttpClient.

以下を考えると:

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
...

メソッドが呼び出されると、Post次の例外が発生します。

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 でこの投稿を見つけました。私は彼の作品を複製し(彼のMachineオブジェクトは私のような単純なPOCOであると推測していますMyInfo)、同じ「シリアライズできません」という例外に遭遇しました。

4

1 に答える 1

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ようです。

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

MyInfoの外に移動するとModule、エラーは発生しなくなります。また、例外を防ぐためにメディア タイプが必要ではなくなりましたが、メディア タイプがないとContent-Typeヘッダーがなくなり、サーバーがメッセージ本文を逆シリアル化する方法を知らない可能性があるため、サーバー側で転送されない可能性があることにも注意してください。私の場合、Content-Type: application/xmlサーバーのためにヘッダーがリクエストに含まれるように、メディア タイプをそのままにしておく必要がありました。

于 2011-07-27T20:18:54.360 に答える