小编Mar*_*ark的帖子

如何在Windbg中解决GetFrameContext失败

我正在使用完整的崩溃转储和Windbg调试.NET 4.0 Web应用程序.我似乎能够获得所有的所有版本以匹配,但是当我尝试获得所有线程的托管堆栈跟踪时

操作系统线程ID:0x7cd4(13)子SP IP呼叫站点GetFrameContext失败:1

对于我所有的托管线程.我有什么想法我错了以及如何解决它?

windbg .net-4.0 crash-dumps stack-trace

12
推荐指数
2
解决办法
4456
查看次数

如何在Redrected页面上进行GET/POST时,让HttpWebRequest.AllowAutoRedirect设置cookie?

有没有办法让HttpWebRequest对象在通过该AllowAutoRedirect功能自动重定向到另一个页面时考虑到set-cookie标头?我需要它来维护重定向的cookie信息; 如果框架可以为我做这个,我宁愿不必自己实现重定向.这必须是一个常见的请求,因为我见过的大多数登录页面通常会这样做.

c# cookies redirect httpwebrequest

11
推荐指数
1
解决办法
8022
查看次数

什么是组织.NET跨平台开发的Visual Studio项目和代码的行业标准方法

我在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

11
推荐指数
1
解决办法
1347
查看次数

NetworkStream.Read会挂起/阻止的原因是什么?

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,据我所知,它可以阻塞.我只是不知道为什么有时它会阻止,有时它不会.

c# sockets networkstream blocking

9
推荐指数
3
解决办法
1万
查看次数

我应该在发布版本上打开.NET 4.0的代码合同的运行时检查吗?

假设所有新的.NET 4.0代码

我看到可以选择打开它们.但是我不明白最佳做法是什么?

最好的做法是,一旦完成静态检查,您真的不需要进行运行时检查(因为编译器确保满足条件)?或者是否存在即使编译器为您检查它的情况,仍然可能在运行时期间不满足条件?

任何良好的在线讨论或文章.我看到很多解释如何做但不是很多解释哪个是最好的做法,假设所有新的.NET 4.0代码都没有所需的向后兼容性.

c# .net-4.0 code-contracts

9
推荐指数
1
解决办法
1002
查看次数

如何为二进制格式化程序创建SerializationBinder,以处理从一个程序集和名称空间到另一个程序集和名称空间的类型移动

背景如下

  1. 我想通过将代码移动到不同的项目来重构代码
  2. 其中一些代码包含可序列化的DTO,用于跨多个端点发送和接收数据
  3. 如果我移动代码,序列化中断(因此它不能与我的应用程序的旧版本向后兼容)

这个问题的解决方案是SerializationBinder,它允许我在某种意义上从一种类型"重定向"到另一种类型.

因此,我想创建一个SerializationBinder来满足这种需求.但是,它必须满足以下要求

  1. SerializationBinder的输入应该是旧类型到新类型映射的列表.映射应包括旧程序集名称(无版本,无公钥标记)和类型的旧全名(名称空间和名称)以及新程序集名称和类型的新全名
  2. 对于输入中的类型,应忽略程序集的版本号
  3. 如果我的类型恰好在泛型(List,Dictionary等)中,它应该处理泛型,而不需要在输入中包含泛型
  4. 对于不在输入中的任何内容(例如,未移动的类型或.NET类型,例如数据集),它应该默认使用二进制序列化器的开箱即用算法

这可能还是我在做梦?那里有什么东西已经做到了吗?我认为这是一个常见的问题.

到目前为止,我认为没有简单的方法可以做到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

9
推荐指数
2
解决办法
5268
查看次数

我应该在使用大对象堆后立即调用GC.Collect以防止碎片

我的应用程序对大对象进行了大量的二进制序列化和压缩.未压缩的序列化数据集大约为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

8
推荐指数
1
解决办法
3550
查看次数

如何获取IPhone或IPad(iOS 5.x)以正确识别我的证书根权限

我使用创建了一个自签名的根权限证书makecert.我由该机构创建了SSL证书问题,并使用它绑定了我的IIS 7网站.然后我使用IPhoneConfigurationUtility将根证书推送到我的iPad.但是,当我使用iPad浏览到我的HTTPS站点时,它仍然不信任它.我究竟做错了什么?我可以在这里提供哪些信息来帮助你帮助我.

我按照此MSDN页面上的步骤执行此操作.唯一的例外是我在IIS 7上

iphone ssl certificate self-signed ios

8
推荐指数
1
解决办法
762
查看次数

如何在Windows Server 2012 R2上解决PerfView for 64位进程中的BROKEN堆栈

我正在生产系统上运行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中得到修复

有什么想法吗?

.net ngen perfview

8
推荐指数
1
解决办法
1172
查看次数

如何以编程方式检测我的应用程序是否在ASP.NET页面中的IIS 7.0集成模式下运行

通常我们应该控制我们的AppPools并能够强制管理管道模式.在我的情况下,我没有控制权,并希望根据托管流水线模式(集成与经典)实现代码背后的代码.我只是不知道如何检测到这一点.有没有一种简单的方法可以在页面后面的代码中执行此操作?

c# asp.net iis-7 integrated-pipeline-mode

7
推荐指数
2
解决办法
2528
查看次数