有没有什么好的方法(除了繁琐地查询每个属性)在C#中为HttpWebRequest构建诊断转储字符串?对于简单的对象,人们可以逃避使用new JObject(theObject),但这对HttpWebRequest不起作用(toString当然,对于HttpWebRequest,它在任何C#对象上都是无用的).
对于C#对象的任何子集,是否有任何通用的方法(除了使用new JObject我已经提到的)之外?
更新: 我发现使用JsonConvert.SerializeObject(Hans的链接中的一个建议)可以很好地转储HttpWebRequest(尽管它没有获取请求流).我有点使System.Net.Tracing的东西工作(尽管文档,像往常一样用于.NET的东西,很糟糕).
事实证明这很好用:
string httpWebRequestDump(HttpWebRequest hwr)
{
return JsonConvert.SerializeObject(hwr,Formatting.Indented);
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是它不会转储相关的请求流.我还没有找到从请求中提取的方法.
作为一个快速回应,我会说ToString()通过创建您自己的变体类来覆盖该函数,其中唯一的区别是ToString()方法;例如:
class HttpWebRequest2 : HttpWebRequest
{
public HttpWebRequest2(System.Runtime.Serialization.SerializationInfo SerializationInfo, System.Runtime.Serialization.StreamingContext StreamingContext)
: base(SerializationInfo, StreamingContext) { }
public override string ToString()
{
// Edit ToString() code here.
// For example:
string retval = "[Accept] = " + Accept.ToString()
+ "\r\n[Address] = " + Address.ToString()
+ "\r\n[AllowAutoRedirect] = " + AllowAutoRedirect.ToString()
+ "\r\n[AllowReadStreamBuffering] = " + AllowReadStreamBuffering.ToString()
+ "\r\n[AllowWriteStreamBuffering] = " + AllowWriteStreamBuffering.ToString()
+ "\r\n[AuthenticationLevel] = " + AuthenticationLevel.ToString()
+ "\r\n[AutomaticDecompression] = " + AutomaticDecompression.ToString()
+ "\r\n[CachePolicy] = " + CachePolicy.ToString()
+ "\r\n[ClientCertificates] = " + ClientCertificates.ToString()
+ "\r\n[Connection] = " + Connection.ToString()
+ "\r\n[ConnectionGroupName] = " + ConnectionGroupName.ToString()
+ "\r\n[ContentLength] = " + ContentLength.ToString()
+ "\r\n[ContentType] = " + ContentType.ToString()
+ "\r\n[ContinueDelegate] = " + ContinueDelegate.ToString()
+ "\r\n[ContinueTimeout] = " + ContinueTimeout.ToString()
+ "\r\n[CookieContainer] = " + CookieContainer.ToString()
+ "\r\n[CreatorInstance] = " + CreatorInstance.ToString()
+ "\r\n[Credentials] = " + Credentials.ToString()
+ "\r\n[Date] = " + Date.ToString()
+ "\r\n[DefaultCachePolicy] = " + DefaultCachePolicy.ToString()
+ "\r\n[DefaultMaximumErrorResponseLength] = " + DefaultMaximumErrorResponseLength.ToString()
+ "\r\n[DefaultMaximumResponseHeadersLength] = " + DefaultMaximumResponseHeadersLength.ToString()
+ "\r\n[Expect] = " + Expect.ToString()
+ "\r\n[HaveResponse] = " + HaveResponse.ToString()
+ "\r\n[Headers] = " + Headers.ToString()
+ "\r\n[Host] = " + Host.ToString()
+ "\r\n[IfModifiedSince] = " + IfModifiedSince.ToString()
+ "\r\n[ImpersonationLevel] = " + ImpersonationLevel.ToString()
+ "\r\n[KeepAlive] = " + KeepAlive.ToString()
+ "\r\n[MaximumAutomaticRedirections] = " + MaximumAutomaticRedirections.ToString()
+ "\r\n[MaximumResponseHeadersLength] = " + MaximumResponseHeadersLength.ToString()
+ "\r\n[MediaType] = " + MediaType.ToString()
+ "\r\n[Method] = " + Method.ToString()
+ "\r\n[Pipelined] = " + Pipelined.ToString()
+ "\r\n[PreAuthenticate] = " + PreAuthenticate.ToString()
+ "\r\n[ProtocolVersion] = " + ProtocolVersion.ToString()
+ "\r\n[Proxy] = " + Proxy.ToString()
+ "\r\n[ReadWriteTimeout] = " + ReadWriteTimeout.ToString()
+ "\r\n[Referer] = " + Referer.ToString()
+ "\r\n[RequestUri] = " + RequestUri.ToString()
+ "\r\n[SendChunked] = " + SendChunked.ToString()
+ "\r\n[ServerCertificateValidationCallback] = " + ServerCertificateValidationCallback.ToString()
+ "\r\n[ServicePoint] = " + ServicePoint.ToString()
+ "\r\n[SupportsCookieContainer] = " + SupportsCookieContainer.ToString()
+ "\r\n[Timeout] = " + Timeout.ToString()
+ "\r\n[TransferEncoding] = " + TransferEncoding.ToString()
+ "\r\n[UnsafeAuthenticatedConnectionSharing] = " + UnsafeAuthenticatedConnectionSharing.ToString()
+ "\r\n[UseDefaultCredentials] = " + UseDefaultCredentials.ToString()
+ "\r\n[UserAgent] = " + UserAgent.ToString();
return retval;
}
}
Run Code Online (Sandbox Code Playgroud)
对于请求流,将其复制到内存流怎么样?沿着以下路线:
int count = 0;
do
{
count = responseStream.Read(buffer, 0, buffer.Length);
memoryStream.Write(buffer, 0, count);
Response.BinaryWrite(buffer);
}
while (count != 0);
result = memoryStream.ToArray(); // or ToString() etc. as it takes you fancy/suits your needs :)
Run Code Online (Sandbox Code Playgroud)
然后,这将允许您保留原始请求流,并根据需要使用内存流中的副本来打印/存储等。
这将返回一个字符串,其中包含可以包含 getter 的所有值HttpWebRequest:)
您所要做的就是使用它HttpWebRequest2(),应该没问题:)
让我知道这是否有帮助,或者您是否需要更多信息/不同的方法:)