我正在使用完整的崩溃转储和Windbg调试.NET 4.0 Web应用程序.我似乎能够获得所有的所有版本以匹配,但是当我尝试获得所有线程的托管堆栈跟踪时
操作系统线程ID:0x7cd4(13)子SP IP呼叫站点GetFrameContext失败:1
对于我所有的托管线程.我有什么想法我错了以及如何解决它?
有没有办法让HttpWebRequest对象在通过该AllowAutoRedirect功能自动重定向到另一个页面时考虑到set-cookie标头?我需要它来维护重定向的cookie信息; 如果框架可以为我做这个,我宁愿不必自己实现重定向.这必须是一个常见的请求,因为我见过的大多数登录页面通常会这样做.
我在Visual Studio中有一个相当大的C#项目解决方案.我想将其中一些项目移植到MONO中并在MAC上运行.当然有些东西不起作用,有些东西我不想移植,因为它们不适用于MAC.
一种方法是解决方案和项目配置.这允许我排除我不想构建的项目(不幸的是,Visual Studio并不能使其容易看到,但无论如何......).
可以与第一种方法协同工作的第二种方法是使用预编译器指令,例如#if MONO,然后在那时做一些事情.这很好但是它创建了同一个程序集的多个版本.如何在编译后区分这两者?这是一个问题吗?
即使前两种方法有效,有时我也想要一个大项目的一部分.我不想浏览20个左右的文件并放入#if MONO吗?我可以手工劫持项目文件,但在visual studio中没有任何可见性.除非他们卸载项目并打开XML并查看,否则团队中没有其他人可以知道发生了什么.这听起来很疯狂.更糟糕的是,有时项目会引用某些内容,我想排除MONO的引用.现在我必须编辑csproj.
我可以分割项目,但如果在某些时候我想要移植到另一个平台.平台的交叉点需要什么代码可以变得疯狂.更糟糕的是,我可以让项目引用这个大型项目,然后也可能需要拆分.这一切都有效但是会导致项目超载吗?
我找不到一个好的清洁解决方案.有小费吗?我可以遵循这个标准吗?如果VS对csproj文件的编辑有更多的可见性,这可能会起作用.
.net mono cross-platform projects-and-solutions visual-studio
MSDN文档似乎暗示NetworkStream.Read将始终立即返回.如果没有找到数据,则返回0.但是,我有一些当前部署的代码,仅在某些情况下(我还没有想出哪些代码),NetworkStream.Read似乎挂起.这是我能够从转储文件中收集的堆栈跟踪
00000000705ae850 000007fef784f60d DomainBoundILStubClass.IL_STUB(IntPtr, Byte*, Int32, System.Net.Sockets.SocketFlags) 00000000705ae930 000007fef785c930 System.Net.Sockets.Socket.Receive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.Net.Sockets.SocketError ByRef) 00000000705ae9b0 000007ff004eb668 System.Net.Sockets.NetworkStream.Read(Byte[], Int32, Int32) 00000000705aea40 000007fef784e6ae MySocketStuff.SocketConnectCallback(System.IAsyncResult) 00000000705aeb20 000007fef84f2bbb System.Net.LazyAsyncResult.Complete(IntPtr) 00000000705aeb90 000007fef7853c7b System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 00000000705aebe0 000007fef784e5d3 System.Net.ContextAwareResult.Complete(IntPtr) 00000000705aec40 000007fef7d027f9 System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr) 00000000705aeca0 000007fef8b9815e System.Net.Sockets.Socket.ConnectCallback() 00000000705aed20 000007fef93e14c2 System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean)
我注意到NetworkStrea.Read实际上调用了Socket.Receive,据我所知,它可以阻塞.我只是不知道为什么有时它会阻止,有时它不会.
假设所有新的.NET 4.0代码
我看到可以选择打开它们.但是我不明白最佳做法是什么?
最好的做法是,一旦完成静态检查,您真的不需要进行运行时检查(因为编译器确保满足条件)?或者是否存在即使编译器为您检查它的情况,仍然可能在运行时期间不满足条件?
任何良好的在线讨论或文章.我看到很多解释如何做但不是很多解释哪个是最好的做法,假设所有新的.NET 4.0代码都没有所需的向后兼容性.
背景如下
这个问题的解决方案是SerializationBinder,它允许我在某种意义上从一种类型"重定向"到另一种类型.
因此,我想创建一个SerializationBinder来满足这种需求.但是,它必须满足以下要求
这可能还是我在做梦?那里有什么东西已经做到了吗?我认为这是一个常见的问题.
到目前为止,我认为没有简单的方法可以做到3而且完全不做4.
这是一次尝试
public class SmartDeserializationBinder : SerializationBinder
{
/// <summary>
/// Private class to handle storing type mappings
/// </summary>
private class TypeMapping
{
public string OldAssemblyName { get; set; }
public string OldTypeName { get; set; }
public string NewAssemblyName { get; set; }
public string NewTypeName { get; set; }
}
List<TypeMapping> typeMappings;
public SmartDeserializationBinder()
{
typeMappings = new List<TypeMapping>();
}
public void AddTypeMapping(string oldAssemblyName, string oldTypeName, …Run Code Online (Sandbox Code Playgroud) .net c# serialization backwards-compatibility binary-serialization
我的应用程序对大对象进行了大量的二进制序列化和压缩.未压缩的序列化数据集大约为14 MB.压缩它是1.5 MB左右.我发现每当我在我的数据集上调用serialize方法时,我的大对象堆性能计数器就会从1 MB以下跳到大约90 MB.我也知道在一个相对繁重的系统下,通常在运行(天)一段时间后,这个序列化过程发生了一段时间,已知应用程序在调用此序列化方法时会丢失内存消除,即使在那里似乎是充足的记忆.我猜测碎片是个问题(虽然我不能说我百分百肯定,我很接近)
最简单的短期修复(我想我正在寻找短期和长期答案)我能想到的是在完成序列化过程后立即调用GC.Collect.在我看来,这将垃圾收集来自LOH的对象,并且可能在其他对象被添加到它之前这样做.这将允许其他对象紧密地紧贴堆中的其余对象,而不会造成太多碎片.
除了这个荒谬的90MB分配,我认为我没有任何其他使用丢失的LOH.这种90 MB的分配也相对较少(每4小时一次).我们当然仍然会有1.5 MB的阵列,也许还有其他一些较小的序列化对象.
有任何想法吗?
由于良好的反应而更新
这是我的代码,它完成了这项工作.我实际上已经尝试将其更改为压缩WHILE序列化,以便序列化同时序列化为流并且我没有得到更好的结果.我还尝试将内存流预先分配到100 MB并尝试连续两次使用相同的流,不过LOH最高可达180 MB.我正在使用Process Explorer来监控它.这太疯狂了.我想我接下来会尝试UnmanagedMemoryStream的想法.
如果你不习惯,我会鼓励你们尝试一下.它不一定是这个确切的代码.只是序列化一个大型数据集,你会得到令人惊讶的结果(我有很多表,15周围和许多字符串和列)
byte[] bytes;
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer =
new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream memStream = new System.IO.MemoryStream();
serializer.Serialize(memStream, obj);
bytes = CompressionHelper.CompressBytes(memStream.ToArray());
memStream.Dispose();
return bytes;
Run Code Online (Sandbox Code Playgroud)
使用UnmanagedMemoryStream尝试二进制序列化后更新
即使我序列化为UnmanagedMemoryStream,LOH也会跳到相同的大小.似乎无论我做什么,调用BinaryFormatter来序列化这个大对象都会使用LOH.至于预分配,它似乎没什么帮助.假设我预分配说我预分配100MB,然后我序列化,它将使用170 MB.这是代码.甚至比上面的代码更简单
BinaryFormatter serializer = new BinaryFormatter();
MemoryStream memoryStream = new MemoryStream(1024*1024*100);
GC.Collect();
serializer.Serialize(memoryStream, assetDS);
Run Code Online (Sandbox Code Playgroud)
中间的GC.Collect()只是为了更新LOH性能计数器.您将看到它将分配正确的100 MB.但是当你调用序列化时,你会注意到它似乎在你已经分配的100之上添加了它.
c# memory-management out-of-memory fragmentation large-object-heap
我使用创建了一个自签名的根权限证书makecert.我由该机构创建了SSL证书问题,并使用它绑定了我的IIS 7网站.然后我使用IPhoneConfigurationUtility将根证书推送到我的iPad.但是,当我使用iPad浏览到我的HTTPS站点时,它仍然不信任它.我究竟做错了什么?我可以在这里提供哪些信息来帮助你帮助我.
我按照此MSDN页面上的步骤执行此操作.唯一的例外是我在IIS 7上
我正在生产系统上运行perfview(只是默认集合),其中CPU在几分钟的时间内达到100%的峰值.我得到了一些有用的结果,但我也得到了一堆BROKEN堆栈.
该计算机是Windows Server 2012 R2.该应用程序是一个启动的exe.应用程序在.NET 4.0中编译,但服务器运行的是.NET 4.6.1
perfview帮助说我的情况的这些BROKEN堆栈是在Windows 8中修复的(我也猜测Windows Server 2012).我的dll不是ngen-ed但我不认为我必须这样,因为,问题在Windows 8中得到修复
有什么想法吗?
通常我们应该控制我们的AppPools并能够强制管理管道模式.在我的情况下,我没有控制权,并希望根据托管流水线模式(集成与经典)实现代码背后的代码.我只是不知道如何检测到这一点.有没有一种简单的方法可以在页面后面的代码中执行此操作?
c# ×6
.net ×3
.net-4.0 ×2
asp.net ×1
blocking ×1
certificate ×1
cookies ×1
crash-dumps ×1
iis-7 ×1
ios ×1
iphone ×1
mono ×1
ngen ×1
perfview ×1
redirect ×1
self-signed ×1
sockets ×1
ssl ×1
stack-trace ×1
windbg ×1