HttpWebRequest对象的诊断转储

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

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

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

事实certificate这很好用:

 string httpWebRequestDump(HttpWebRequest hwr) { return JsonConvert.SerializeObject(hwr,Formatting.Indented); } 

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

作为快速响应,我会说通过创建自己的变体类来覆盖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; } } 

对于请求流:

对于请求流,如何将其复制到内存流? 沿着:

 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 :) 

然后,这将允许您单独保留原始请求流,并根据需要使用内存流中的副本进行打印/存储等。


这将返回一个字符串,其中包含可以在HttpWebRequest getter的所有值:)

所有你需要做的是使用HttpWebRequest2()代替它应该没关系:)

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

我喜欢GMasucci的答案比JSON序列化更好,因为序列化没有提取标题的值。

我修改了GMasucci的答案是一个扩展方法,并使用StringBuilder和AppendFormat,以便nulls不会炸毁它,所以如果你对这个答案进行投票,请向他投票。 我评论了似乎也被弃用的属性:

 public static String ToStringReadable(this HttpWebRequest request) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[Accept] = {0}", request.Accept); sb.AppendFormat("{0}[Address] = {1}", Environment.NewLine, request.Address); sb.AppendFormat("{0}[AllowAutoRedirect] = {1}", Environment.NewLine, request.AllowAutoRedirect); //sb.AppendFormat("{0}[AllowReadStreamBuffering] = {1}", Environment.NewLine, request.AllowReadStreamBuffering); sb.AppendFormat("{0}[AllowWriteStreamBuffering] = {1}", Environment.NewLine, request.AllowWriteStreamBuffering); sb.AppendFormat("{0}[AuthenticationLevel] = {1}", Environment.NewLine, request.AuthenticationLevel); sb.AppendFormat("{0}[AutomaticDecompression] = {1}", Environment.NewLine, request.AutomaticDecompression); sb.AppendFormat("{0}[CachePolicy] = {1}", Environment.NewLine, request.CachePolicy); sb.AppendFormat("{0}[ClientCertificates] = {1}", Environment.NewLine, request.ClientCertificates); sb.AppendFormat("{0}[Connection] = {1}", Environment.NewLine, request.Connection); sb.AppendFormat("{0}[ConnectionGroupName] = {1}", Environment.NewLine, request.ConnectionGroupName); sb.AppendFormat("{0}[ContentLength] = {1}", Environment.NewLine, request.ContentLength); sb.AppendFormat("{0}[ContentType] = {1}", Environment.NewLine, request.ContentType); sb.AppendFormat("{0}[ContinueDelegate] = {1}", Environment.NewLine, request.ContinueDelegate); //sb.AppendFormat("{0}[ContinueTimeout] = {1}", Environment.NewLine, request.ContinueTimeout); sb.AppendFormat("{0}[CookieContainer] = {1}", Environment.NewLine, request.CookieContainer); //sb.AppendFormat("{0}[CreatorInstance] = {1}", Environment.NewLine, request.CreatorInstance); sb.AppendFormat("{0}[Credentials] = {1}", Environment.NewLine, request.Credentials); //sb.AppendFormat("{0}[Date] = {1}", Environment.NewLine, request.Date); //sb.AppendFormat("{0}[DefaultCachePolicy] = {1}", Environment.NewLine, request.DefaultCachePolicy); //sb.AppendFormat("{0}[DefaultMaximumErrorResponseLength] = {1}", Environment.NewLine, request.DefaultMaximumErrorResponseLength); //sb.AppendFormat("{0}[DefaultMaximumResponseHeadersLength] = {1}", Environment.NewLine, request.DefaultMaximumResponseHeadersLength); sb.AppendFormat("{0}[Expect] = {1}", Environment.NewLine, request.Expect); sb.AppendFormat("{0}[HaveResponse] = {1}", Environment.NewLine, request.HaveResponse); sb.AppendFormat("{0}[Headers] = {1}", Environment.NewLine, request.Headers); //sb.AppendFormat("{0}[Host] = {1}", Environment.NewLine, request.Host); sb.AppendFormat("{0}[IfModifiedSince] = {1}", Environment.NewLine, request.IfModifiedSince); sb.AppendFormat("{0}[ImpersonationLevel] = {1}", Environment.NewLine, request.ImpersonationLevel); sb.AppendFormat("{0}[KeepAlive] = {1}", Environment.NewLine, request.KeepAlive); sb.AppendFormat("{0}[MaximumAutomaticRedirections] = {1}", Environment.NewLine, request.MaximumAutomaticRedirections); sb.AppendFormat("{0}[MaximumResponseHeadersLength] = {1}", Environment.NewLine, request.MaximumResponseHeadersLength); sb.AppendFormat("{0}[MediaType] = {1}", Environment.NewLine, request.MediaType); sb.AppendFormat("{0}[Method] = {1}", Environment.NewLine, request.Method); sb.AppendFormat("{0}[Pipelined] = {1}", Environment.NewLine, request.Pipelined); sb.AppendFormat("{0}[PreAuthenticate] = {1}", Environment.NewLine, request.PreAuthenticate); sb.AppendFormat("{0}[ProtocolVersion] = {1}", Environment.NewLine, request.ProtocolVersion); sb.AppendFormat("{0}[Proxy] = {1}", Environment.NewLine, request.Proxy); sb.AppendFormat("{0}[ReadWriteTimeout] = {1}", Environment.NewLine, request.ReadWriteTimeout); sb.AppendFormat("{0}[Referer] = {1}", Environment.NewLine, request.Referer); sb.AppendFormat("{0}[RequestUri] = {1}", Environment.NewLine, request.RequestUri); sb.AppendFormat("{0}[SendChunked] = {1}", Environment.NewLine, request.SendChunked); //sb.AppendFormat("{0}[ServerCertificateValidationCallback] = {1}", Environment.NewLine, request.ServerCertificateValidationCallback); sb.AppendFormat("{0}[ServicePoint] = {1}", Environment.NewLine, request.ServicePoint); //sb.AppendFormat("{0}[SupportsCookieContainer] = {1}", Environment.NewLine, request.SupportsCookieContainer); sb.AppendFormat("{0}[Timeout] = {1}", Environment.NewLine, request.Timeout); sb.AppendFormat("{0}[TransferEncoding] = {1}", Environment.NewLine, request.TransferEncoding); sb.AppendFormat("{0}[UnsafeAuthenticatedConnectionSharing] = {1}", Environment.NewLine, request.UnsafeAuthenticatedConnectionSharing); sb.AppendFormat("{0}[UseDefaultCredentials] = {1}", Environment.NewLine, request.UseDefaultCredentials); sb.AppendFormat("{0}[UserAgent] = {1}", Environment.NewLine, request.UserAgent); return sb.ToString(); } 

我修改了GMasucci和jaybro使用HttpRequest的答案,用于代替HttpWebRequest的情况。

 public static String ToStringReadable (HttpRequest request) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("{0}[AcceptTypes] = {1}", Environment.NewLine, request.AcceptTypes); sb.AppendFormat("{0}[AnonymousID] = {1}", Environment.NewLine, request.AnonymousID); sb.AppendFormat("{0}[ApplicationPath] = {1}", Environment.NewLine, request.ApplicationPath); sb.AppendFormat("{0}[AppRelativeCurrentExecutionFilePath] = {1}", Environment.NewLine, request.AppRelativeCurrentExecutionFilePath); sb.AppendFormat("{0}[Browser] = {1}", Environment.NewLine, request.Browser); sb.AppendFormat("{0}[ClientCertificate] = {1}", Environment.NewLine, request.ClientCertificate); sb.AppendFormat("{0}[ContentEncoding] = {1}", Environment.NewLine, request.ContentEncoding); sb.AppendFormat("{0}[ContentLength] = {1}", Environment.NewLine, request.ContentLength); sb.AppendFormat("{0}[ContentType] = {1}", Environment.NewLine, request.ContentType); sb.AppendFormat("{0}[Cookies] = {1}", Environment.NewLine, request.Cookies); sb.AppendFormat("{0}[CurrentExecutionFilePath] = {1}", Environment.NewLine, request.CurrentExecutionFilePath); sb.AppendFormat("{0}[CurrentExecutionFilePathExtension] = {1}", Environment.NewLine, request.CurrentExecutionFilePathExtension); sb.AppendFormat("{0}[FilePath] = {1}", Environment.NewLine, request.FilePath); sb.AppendFormat("{0}[Files] = {1}", Environment.NewLine, request.Files); sb.AppendFormat("{0}[Filter] = {1}", Environment.NewLine, request.Filter); sb.AppendFormat("{0}[Form] = {1}", Environment.NewLine, request.Form); sb.AppendFormat("{0}[Headers] = {1}", Environment.NewLine, request.Headers); sb.AppendFormat("{0}[HttpChannelBinding] = {1}", Environment.NewLine, request.HttpChannelBinding); sb.AppendFormat("{0}[HttpMethod] = {1}", Environment.NewLine, request.HttpMethod); sb.AppendFormat("{0}[InputStream] = {1}", Environment.NewLine, request.InputStream); sb.AppendFormat("{0}[IsAuthenticated] = {1}", Environment.NewLine, request.IsAuthenticated); sb.AppendFormat("{0}[IsLocal] = {1}", Environment.NewLine, request.IsLocal); sb.AppendFormat("{0}[IsSecureConnection] = {1}", Environment.NewLine, request.IsSecureConnection); sb.AppendFormat("{0}[Params] = {1}", Environment.NewLine, request.Params); sb.AppendFormat("{0}[Path] = {1}", Environment.NewLine, request.Path); sb.AppendFormat("{0}[PathInfo] = {1}", Environment.NewLine, request.PathInfo); sb.AppendFormat("{0}[PhysicalApplicationPath] = {1}", Environment.NewLine, request.PhysicalApplicationPath); sb.AppendFormat("{0}[PhysicalPath] = {1}", Environment.NewLine, request.PhysicalPath); sb.AppendFormat("{0}[QueryString] = {1}", Environment.NewLine, request.QueryString); sb.AppendFormat("{0}[RawUrl] = {1}", Environment.NewLine, request.RawUrl); sb.AppendFormat("{0}[ReadEntityBodyMode] = {1}", Environment.NewLine, request.ReadEntityBodyMode); sb.AppendFormat("{0}[RequestContext] = {1}", Environment.NewLine, request.RequestContext); sb.AppendFormat("{0}[RequestType] = {1}", Environment.NewLine, request.RequestType); sb.AppendFormat("{0}[ServerVariables] = {1}", Environment.NewLine, request.ServerVariables); sb.AppendFormat("{0}[TimedOutToken] = {1}", Environment.NewLine, request.TimedOutToken); sb.AppendFormat("{0}[TlsTokenBindingInfo] = {1}", Environment.NewLine, request.TlsTokenBindingInfo); sb.AppendFormat("{0}[TotalBytes] = {1}", Environment.NewLine, request.TotalBytes); sb.AppendFormat("{0}[Unvalidated] = {1}", Environment.NewLine, request.Unvalidated); sb.AppendFormat("{0}[Url] = {1}", Environment.NewLine, request.Url); sb.AppendFormat("{0}[UrlReferrer] = {1}", Environment.NewLine, request.UrlReferrer); sb.AppendFormat("{0}[UserAgent] = {1}", Environment.NewLine, request.UserAgent); sb.AppendFormat("{0}[UserHostAddress] = {1}", Environment.NewLine, request.UserHostAddress); sb.AppendFormat("{0}[UserHostName] = {1}", Environment.NewLine, request.UserHostName); sb.AppendFormat("{0}[UserLanguages] = {1}", Environment.NewLine, request.UserLanguages); return sb.ToString(); }