Tag: .net 4.5

如何使用.Net 4.0中包含的HttpClient类将文件上传到IIS Express中运行的Asp.Net MVC 4.0操作

我有一个C / S应用程序。 我使用Asp.Net MVC 4.0实现了服务器,客户端运行在.Net 4.5上。 我在服务器端有一个Controller Action,如下所示: public JsonResult Upload(string arg1, int arg2) { //do something about arg1 and arg2 here … var files = Request.Files; if (files.Count > 0) { foreach(var file in files) { var ms = new MemoryStream(); file.InputStream.CopyTo(ms); //save it to somewhere … } } … } 我创建了一个测试html页面,在浏览器中测试它。 它按预期工作。 […]

Uri.EscapeDataString很奇怪

为什么EscapeDataString在.NET 4和4.5之间表现不同? 输出是 Uri.EscapeDataString(“-_.!~*'()”) => “-_.!~*'()” Uri.EscapeDataString(“-_.!~*'()”) => “-_.%21~%2A%27%28%29” 文档 默认情况下,EscapeDataString方法将除RFC 2396非保留字符之外的所有字符转换为hex表示forms。 如果启用了国际资源标识符(IRI)或国际化域名(IDN)解析,则EscapeDataString方法将除RFC 3986非保留字符之外的所有字符转换为其hex表示forms。 在转义之前,所有Unicode字符都将转换为UTF-8格式。 作为参考,非保留字符在RFC 2396中定义如下: unreserved = alphanum | mark mark = “-” | “_” | “.” | “!” | “~” | “*” | “‘” | (” | “)” 在RFC 3986中 : ALPHA / DIGIT / “-” / “.” / “_” / “~” […]

Windows窗体应用程序中的任务并行库代码冻结 – 作为Windows控制台应用程序正常工作

这个问题是我曾问过的上一个问题的后续问题: 如何使用C#并行执行多个“Ping” 我能够获得接受的答案(Windows控制台应用程序),但是当我尝试在Windows窗体应用程序中运行代码时,以下代码将冻结在包含Task.WaitAll(pingTasks.ToArray()) 。 这是我试图运行的代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.NetworkInformation; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { List addresses = new List(); for (Int32 i […]

SmtpClient.SendMailAsync方法是否安全线程?

SmtpClient类声明实例成员不是线程安全的。 如果对Send或SendAsync进行并发调用,则可以看到这一点。 如果第一个尚未完成,则两个方法都会在第二次调用时抛出InvalidOperationException。 .NET 4.5中引入的方法SendMailAsync不会将InvalidOperationException列为抛出exception。 新的.NET 4.5方法是否实现某种排队? Reflector无法阐明这个类的实现细节,所以我假设这已经在本机方法中实现了。 多个线程可以安全地调用SMTP客户端的共享实例上的SendMessageAsync方法吗?

使用JSON.NET将属性反序列化为ExpandoObject

例如,有一个像下一个的对象: public class Container { public object Data { get; set; } } 它以这种方式使用: Container container = new Container { Data = new Dictionary { { “Text”, “Hello world” } } }; 如果我反序列化从序列化上面的实例获得的JSON字符串, Data属性,即使我提供ExpandoObjectConverter ,它也不会反序列化为ExpandoObject : Container container = JsonConvert.Deserialize(jsonText, new ExpandoObjectConverter()); 如何反序列化使用匿名对象分配的类属性,或者至少不是具体类型作为ExpandoObject ? 编辑: 有人回答说我可以使用动态对象。 这对我不起作用。 我知道我可以这样做,但事实并非如此,因为我需要一个ExpandoObject。 谢谢。 编辑2: 其他一些用户回答我可以将JSON字符串反序列化为ExpandoObject 。 这不是这个问题的目标。 我需要反序列化具有动态属性的具体类型。 在JSON字符串中,此属性可以是关联数组。

为什么HashSet 没有实现IReadOnlyCollection ?

我刚刚发现.NET Fx现在有3个有用的接口: IReadOnlyCollection IReadOnlyList IReadOnlyDictionary 我有点困惑为什么HashSet没有实现IReadOnlyCollection ? 有什么理由,或者微软再次忘记了套装? UPD 经过两个小时的谷歌搜索后,我发现BCL中有很多具有.Count属性的集合,但是没有实现IReadOnlyCollection接口。 UPD2 我发现这篇文章http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/b4fb991a-3f5c-4923-93d4-7cd5c004f859和Immo Landwerth的答案, 他已经说过以下 除了List 和Dictionary 之外的其他集合是否会更新以支持这些接口? 绝对。 实际上,我们所有的内置集合类型都已经实现了IReadOnlyList 和IReadOnlyDictionary 。 这意味着,您可以直接将List,T []或Dictionary 的实例传递给采用IReadOnly版本的API。

无法使用斯堪的纳维亚字符向地址发送电子邮件

使用SmtpClient , MailMessage和MailAddress类,我无法发送到电子邮件地址,例如åbc.def@domain.se。 我得到错误/exception,如下所示: 邮件标题中找到了无效字符:’å’。 —————————发送邮件时出错——————– ——- System.Net.Mail.SmtpException:客户端或服务器仅配置为具有ASCII本地部分的电子邮件地址:åbc.def@domain.se。 在System.Net.Mail.MailAddress.GetUser(Boolean allowUnicode) 在System.Net.Mail.MailAddress.GetAddress(布尔allowUnicode) 在System.Net.Mail.MailAddress.Encode(Int32 charsConsumed,Boolean allowUnicode) System.Net.Mail.Mail.Message.Send上的System.Net.Mail.MailAddressCollection.Encode(Int32 charsConsumed,Boolean allowUnicode)处于System.Net.Mail.Message.PrepareHeaders(Boolean sendEnvelope,Boolean allowUnicode)处(BaseWriter writer,Boolean sendEnvelope) ,System.Net.Mail.SmtpClient.Send(MailMessage消息)中的布尔值allowUnicode) 我的主题/正文中的这些字符很好,但不在电子邮件地址中。 我已经尝试过设置SmtpClient.DeliveryMethod = SmtpDeliveryFormat.International ,或者MailMessage.HeadersEncoding = Encoding.Unicode (或UTF8 ),它似乎没有改变任何东西。 这些是我们需要与之沟通的人的真实电子邮件地址,因此这有点问题。 我一直在挖掘.Net源代码,但没有真正得到任何地方。 我追踪了一个ServerSupportsEai属性,谷歌告诉我EAI代表电子邮件地址国际化( https://tools.ietf.org/html/rfc5336 ),但是我的代码或者特定服务器是否有限制还不太清楚我正在谈论只是不支持这个……因为我正在使用测试服务器来避免向毫无戒心的瑞典人发送电子邮件! 有人可以帮助我清除这一点 – .Net是否支持这一点,如果是这样,如果我的客户端代码应该做什么来启用它呢?

在同一个具有相同名称的合同中不能有两个操作(Async和Non)

当激活以下服务时,我得到以下exception(在相同的合同中不能有两个操作,具有相同的名称,方法ExecuteAsync和Execute)。 [ServiceContract] public interface IMyService { [OperationContract] byte[] Execute(MyRequest request); [OperationContract] Task ExecuteAsync(MyRequest request); } 我想如果您使用svcutil.exe来创建服务引用,这是有道理的,因为基于任务的操作是自动为您创建的。 但是,我不想添加服务引用,而只是使用标准的ChannelFactory来创建WCF通道。 如果不将异步方法重命名为其他方法,还有其他方法吗? 或者我必须在Task.Run中的客户端上包装sync方法吗?

如何创建ImmutableDictionary的新实例?

我想写这样的东西: var d = new ImmutableDictionary { { “a”, 1 }, { “b”, 2 } }; (使用System.Collections.Immutable中的 ImmutableDictionary )。 这似乎是一个简单的用法,因为我预先声明了所有的价值 – 那里没有变异。 但这给了我错误: 类型’ System.Collections.Immutable.ImmutableDictionary ‘没有定义构造函数 我应该如何用静态内容创建一个新的不可变字典?

为什么在取消大量HTTP请求时取消会阻塞这么长时间?

背景 我有一些代码使用来自一个特定主机的内容执行批量HTML页面处理。 它尝试使用HttpClient创建大量(~400)的同步HTTP请求。 我相信ServicePointManager.DefaultConnectionLimit限制了最大并发连接数,所以我没有应用自己的并发限制。 使用Task.WhenAll将所有请求异步发送到HttpClient Task.WhenAll ,可以使用CancellationTokenSource和CancellationToken取消整个批处理操作。 可以通过用户界面查看操作的进度,并且可以单击按钮以执行取消。 问题 对CancellationTokenSource.Cancel()的调用会阻塞大约5到30秒。 这会导致用户界面冻结。 怀疑是因为该方法正在调用注册取消通知的代码。 我考虑过什么 限制同时HTTP请求任务的数量。 我认为这是一种解决方法,因为HttpClient似乎已经HttpClient了过多的请求本身。 在非UI线程中执行CancellationTokenSource.Cancel()方法调用。 这不太好用; 在大多数其他任务完成之前,任务实际上并未运行。 我认为该方法的async版本可以很好地工作,但我找不到一个。 另外,我的印象是它适合在UI线程中使用该方法。 示范 码 class Program { private const int desiredNumberOfConnections = 418; static void Main(string[] args) { ManyHttpRequestsTest().Wait(); Console.WriteLine(“Finished.”); Console.ReadKey(); } private static async Task ManyHttpRequestsTest() { using (var client = new HttpClient()) using (var cancellationTokenSource […]