HttpWebRequest对象的诊断转储

Hot*_*cks 3 c# httpwebrequest

有没有什么好的方法(除了繁琐地查询每个属性)在C#中为HttpWebRequest构建诊断转储字符串?对于简单的对象,人们可以逃避使用new JObject(theObject),但这对HttpWebRequest不起作用(toString当然,对于HttpWebRequest,它在任何C#对象上都是无用的).

对于C#对象的任何子集,是否有任何通用的方法(除了使用new JObject我已经提到的)之外?

更新: 我发现使用JsonConvert.SerializeObject(Hans的链接中的一个建议)可以很好地转储HttpWebRequest(尽管它没有获取请求流).我有点使System.Net.Tracing的东西工作(尽管文档,像往常一样用于.NET的东西,很糟糕).

Hot*_*cks 8

事实证明这很好用:

string httpWebRequestDump(HttpWebRequest hwr)
{
    return JsonConvert.SerializeObject(hwr,Formatting.Indented);
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是它不会转储相关的请求流.我还没有找到从请求中提取的方法.


GMa*_*cci 5

作为一个快速回应,我会说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(),应该没问题:)

让我知道这是否有帮助,或者您是否需要更多信息/不同的方法:)