c# - Given a HttpResponseMessage, how do I read the content of the request? -


given system.net.http.httpresponsemessage, can quite lot of information request made through response.requestmessage, example

response.requestmessage.requesturi // url of request response.requestmessage.method     // http method 

however, can't figure out way useful from

response.requestmessage.content    // stringcontent instance 

i've looked through property tree of stringcontent, can't figure out how contents regular string in way works in watch window.

any suggestions?

analyzing system.net.http.dll v2.2.29.0 ilspy shows system.net.http.httpclienthandler.createresponsemessage (that initializes httpresponse object) doesn't corresponding httprequest's .content. means if wasn't null in first place, content object itself should still available.

system.objectdisposedexception thrown "when operation performed on disposed object." "disposed object" mean? system.net.http.stringcontent turns out implement system.idisposable through ancestor, system.net.http.httpcontent. so, means "an idisposable after .dispose() method called."

naturally, searching httpcontent.dispose() users brings the culprit - system.net.http.httpclient.sendasync() calls system.net.http.httpclient.disposerequestcontent() after sending data.


now, regarding do. httpcontent.dispose() close object's streams , set flag. however, streamcontent (or rather parent, bytearraycontent) keeps data in .content field - isn't touched disposition!

alas, both methods read directly protected, , public methods use check flag first. so, way read reflection (the illustration in ironpython, notes given c# equivalents):

>>> sc=system.net.http.stringcontent("abcdefghijklmnopqrstuvwxyz") #in c#, following `type(stringcontent)' (this does) >>> scd=system.reflection.typedelegator(system.net.http.stringcontent) >>> print scd.getfield("content",system.reflection.bindingflags.nonpublic|system.reflection.bindingflags.instance) none     #because field in bytearraycontent , private >>> bacd=system.reflection.typedelegator(system.net.http.bytearraycontent) >>> bacd.getfield("content",system.reflection.bindingflags.nonpublic|system.reflection.bindingflags.instance) <system.reflection.rtfieldinfo object @ 0x000000000000002c [byte[] content]> # `_' last result >>> _.getvalue(sc) array[byte]((<system.byte object @ 0x000000000000002d [97]>, <system.byte objec t @ 0x000000000000002e [98]>, <system.byte object @ 0x000000000000002f [99]>, <...> 

in c#, like:

type(bytearraycontent)     .getfield("content",bindingflags.nonpublic|bindingflags.instance)     .getvalue(content) 

Comments

Popular posts from this blog

Magento/PHP - Get phones on all members in a customer group -

php - Bypass Geo Redirect for specific directories -

php - .htaccess mod_rewrite for dynamic url which has domain names -