我正在寻找一种简洁的方法来反序列化XmlDocument
对象.我发现最接近的是这个,但我真的很想知道是否有更好的方法(在.NET 4.5甚至4.6),因为我已经有了XmlDocument.
所以目前看起来如下:
// aciResponse.Data is a XmlDocument
MyClass response;
using (XmlReader reader = XmlReader.Create((new StringReader(aciResponse.Data.InnerXml))))
{
var serializer = new XmlSerializer(typeof(MyClass));
response = (MyClass)serializer.Deserialize(reader);
}
Run Code Online (Sandbox Code Playgroud)
谢谢你有更好的主意!
在过去的几天里,我们看到w3wp.exe工作进程间歇性崩溃,为我们公司网站的主应用程序池提供服务.有时崩溃是孤立的,IIS可以成功重启工作进程.但如果在5分钟内发生超过5次崩溃,IIS Rapid Fail Protection将启动并停止应用程序池.以下是崩溃前应用程序事件日志中的示例条目:
An unhandled exception occurred and the process was terminated.
Application ID: /LM/W3SVC/2/ROOT
Process ID: 3640
Exception: System.Threading.ThreadAbortException
Message: Thread was being aborted.
StackTrace: at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr rootedObjectsPointer, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr rootedObjectsPointer, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
Run Code Online (Sandbox Code Playgroud)
由于ThreadAbortException导致崩溃后立即记录了一个更严重的事件:
Faulting application name: w3wp.exe, version: 8.0.9200.16384, time stamp: 0x5010885f
Faulting module name: KERNELBASE.dll, version: 6.2.9200.17366, time stamp: 0x554d16f6
Exception code: 0xe0434352
Fault offset: 0x00010192
Faulting process id: 0xe38
Faulting …
Run Code Online (Sandbox Code Playgroud) 我有一个针对旧版.NET Framework(.NET 4.5.2)的项目.我安装了Visual Studio 2015(因此我的机器上安装了.NET 4.6).我注意到如果我使用.NET 4.6/C#6中发布的C#语言功能,它仍会编译.如果我的项目的目标框架是<.NET 4.6,那么这不应该编译:
public string MyExpressionBodyProperty => "1";
//auto properties are new in C# 6
public string MyAutoProperty { get; } = "1";
private static void MethodThatUsesNameOf(string filename)
{
if (filename == null)
{
//nameof was released in C# 6
throw new ArgumentException("The file does not exist.", nameof(filename));
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能确保我只使用与我所针对的框架版本一起使用的.NET语言功能?
我试图在整个类中禁用代码分析规则,但不是整个项目,只是一个类.在下面的示例中,构建生成CA1822警告,因为它认为单元测试方法应该是静态的.
修复是将以下属性添加到每个单元测试方法:
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")]
然而,这很繁琐,并且混乱了许多单元测试.
我试过了:
#pragma warning disable CA1822
#pragma warning restore CA1822
这两种方法都没有奏效.
public class TestClass
{
public TestClass()
{
// some setup here
}
[Fact]
public void My_Unit_Test1()
{
// the 'this' parameter is never used, causes CA warning 1822
}
[Fact]
public void My_Unit_Test2()
{
// the 'this' parameter is never used, causes CA warning 1822
}
}
Run Code Online (Sandbox Code Playgroud)
使用VS2015 Update 2,.net 4.61和新的代码分析分析器.
Windows 10和Windows Server 2016引入了SO_REUSE_UNICASTPORT
套接字选项.它从.NET 4.6版开始通过ServicePointManager.ReusePort
静态属性在.NET中使用.在非常高的负载(许多并发传出请求通过HttpClient
)期间,我在.NET应用程序上遇到短暂的端口耗尽,我正在考虑使用此选项来处理它.我知道其他方法来处理这个问题(例如编辑Windows注册表以修改临时端口的最大数量或缩短TIME_WAIT),但我也想完全遵循这个解决方案.
文档ServicePointManager.ReusePort
非常小:
将此属性值设置为true会导致来自HttpWebRequest的所有出站TCP连接都使用套接字上的本机套接字选项SO_REUSE_UNICASTPORT.这会导致共享底层传出端口.这对于在短时间内建立大量传出连接并且应用程序可能会耗尽端口的情况非常有用.
查看文档SO_REUSE_UNICASTPORT
并未提供任何其他见解:
设置后,允许对需要显式绑定的Winsock API连接函数进行临时端口重用,例如ConnectEx.请注意,具有隐式绑定的连接函数(例如没有显式绑定的连接)默认设置此选项.在两者都可用的平台上使用此选项而不是SO_PORT_SCALABILITY.
我在网上找不到任何关于如何实现这种"短暂端口重用"的解释,它在技术层面上的确切运作方式,以及它如何降低短暂端口耗尽的风险.我可以期待多少改进?使用此功能,如何计算应用程序的新限制?启用此功能是否有任何缺点?
这一切都笼罩在神秘之中,如果有人可以解释这个新机制及其含义,我会喜欢它.
我已经完成了单元测试,但我不明白为什么“等待Task.Delay()”不等待!
[TestMethod]
public async Task SimpleTest()
{
bool isOK = false;
Task myTask = new Task(async () =>
{
Console.WriteLine("Task.BeforeDelay");
await Task.Delay(1000);
Console.WriteLine("Task.AfterDelay");
isOK = true;
Console.WriteLine("Task.Ended");
});
Console.WriteLine("Main.BeforeStart");
myTask.Start();
Console.WriteLine("Main.AfterStart");
await myTask;
Console.WriteLine("Main.AfterAwait");
Assert.IsTrue(isOK, "OK");
}
Run Code Online (Sandbox Code Playgroud)
这是单元测试的输出:
这怎么可能是“等待”不等待,而主线程继续呢?
在创建新的Visual Studio 2015类库(包)项目时,可以设置多个目标框架.
dotnet
和之间有什么区别net452
?
project.json:
"frameworks": {
"dotnet": { },
"net452": {}
}
Run Code Online (Sandbox Code Playgroud)
项目布局:
我们仍在使用VS 2010 SP1来开发大型LOB ASP.NET Web应用程序.基础设施人员正在考虑将.NET 4.6(以及针对开发人员的目标包)推向桌面,我无法找到与VS 2010兼容的任何内容.其中一个主管说这两个是不兼容的,不能一起使用您必须拥有VS 2012或更高版本,但我找不到任何关于该主题的官方消息.有人知道是否可以使用.NET 4.6和VS 2010 SP1进行开发?
我已经看到很多关于如何将字段标记为标识列的帖子和答案.其中许多已过时,并且目标是旧版本的Entity Framework.
一些资源告诉我在字段上使用属性:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
Run Code Online (Sandbox Code Playgroud)
其他资源告诉我将此代码添加到OnModelCreating
方法:
modelBuilder.Entity<User>().Property(u => u.ID).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
Run Code Online (Sandbox Code Playgroud)
我应该使用哪一个?第一,第二,两者,无所谓,或其他什么?
.net sql-server entity-framework entity-framework-6 .net-4.6
我已经构建了一个从互联网上下载文件的简单控制台应用程序.
因为我遇到了WebClient问题,所以决定使用HttpClient编写我的应用程序.
基本上我正在请求读取标题,然后使用ReadAsStreamAsync
我正在获取流,我正在使用复制到本地文件CopyToAsync
.
我找到了支持IProgress的流的扩展方法:
public static class StreamExtensions
{
public static async Task CopyToAsync(this Stream source, Stream destination, IProgress<long> progress, CancellationToken cancellationToken = default(CancellationToken), int bufferSize = 0x1000)
{
var buffer = new byte[bufferSize];
int bytesRead;
long totalRead = 0;
while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken)) > 0)
{
await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
totalRead += bytesRead;
//Thread.Sleep(10);
progress.Report(totalRead);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序有效,但我得到了错误的进度信息.
例如,当下载2个文件时,我在输出窗口中看到了这个:
file1.tmp 60.95%
file2.tmp 98.09%
file1.tmp 60.98%
file2.tmp …
Run Code Online (Sandbox Code Playgroud) .net-4.6 ×10
.net ×6
c# ×6
asp.net ×2
.net-4.5 ×1
asp.net-core ×1
async-await ×1
asynchronous ×1
c#-6.0 ×1
crash ×1
dnx ×1
iis ×1
sockets ×1
sql-server ×1
task ×1
w3wp ×1
xml ×1