VB.netでPOSTするときにエラー内容のレスポンスが取得できない問題の解決法


VB.netでWebClientやHTTPWebRequestを使って、POSTする場合、400や401など4で始まるエラーが発生するとレスポンスの内容が取得できません。

単純にURLにパラメータをつけてPOSTするだけの場合は、多分大丈夫です。
WebClientの場合は、Byte配列を使って、UploadValuesを使った場合に発生します。
(例:VB.netでヤフーショッピングのストアカテゴリ編集APIを使う方法

HTTPWebRequestの場合は、ContentLengthにデータを乗せて、レスポンスを取得する場合に発生する問題です。

これは、Try~CatchでWebExceptionを補足し、WebExceptionのレスポンスを読み取ることで問題が解決します。
「VB.netでヤフーショッピングのストアカテゴリ編集APIを使う方法」の場合、

            objWC = New System.Net.WebClient()  
            'PUTで送信します。  
            byResult = objWC.UploadValues(sURL, "POST", objPostData)  
            '結果はXML形式で渡されます。  
            sRtn = System.Text.Encoding.UTF8.GetString(byResult)

の部分を、次のように書き換えます。

        Try

objWC = New System.Net.WebClient()
‘PUTで送信します。
byResult = objWC.UploadValues(sURL, “POST”, objPostData)
‘結果はXML形式で渡されます。
sRtn = System.Text.Encoding.UTF8.GetString(byResult)

Catch ex As WebException

Dim objEncError As Encoding = Encoding.UTF8
’MessageBox.Show(ex.Response.Headers.ToString)
Dim resError As WebResponse = ex.Response
Dim resStreamError As Stream = resError.GetResponseStream()
Dim srError As StreamReader = New StreamReader(resStreamError, objEncError)
Dim htmlError As String = srError.ReadToEnd()
srError.Close()
resStreamError.Close()

End Try

すると、htmlErrorの内容は、次のようになりました。

sc-01005