小编Ale*_*lex的帖子

如何将Socket和WinAPI跟踪添加到.NET Core控制台应用程序?

在经典的.NET应用程序中,我通过在app.config中添加以下内容来做到这一点:

<system.diagnostics>
<sources>
  <source name="System.Net" tracemode="includehex" maxdatasize="1024">
    <listeners>
      <add name="System.Net"/>
    </listeners>
  </source>
  <source name="System.Net.Cache">
    <listeners>
      <add name="System.Net"/>
    </listeners>
  </source>
  <source name="System.Net.Http">
    <listeners>
      <add name="System.Net"/>
    </listeners>
  </source>
  <source name="System.Net.Sockets">
    <listeners>
      <add name="System.Net"/>
    </listeners>
  </source>
  <source name="System.Net.WebSockets">
    <listeners>
      <add name="System.Net"/>
    </listeners>
  </source>
</sources>
<switches>
  <add name="System.Net" value="Verbose"/>
  <add name="System.Net.Cache" value="Verbose"/>
  <add name="System.Net.Http" value="Verbose"/>
  <add name="System.Net.Sockets" value="Verbose"/>
  <add name="System.Net.WebSockets" value="Verbose"/>
</switches>
<sharedListeners>
  <add name="System.Net" type="System.Diagnostics.TextWriterTraceListener" initializeData="network.log"/>
</sharedListeners>
<trace autoflush="true"/>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

我可以在.NET Core控制台应用程序中达到相同的效果吗?特别是,我需要查看在使用NegotiateStream类进行NTLM身份验证期间调用了哪些WinAPI函数(以及传递了哪些参数)。

到目前为止,我发现的主要是关于在ASP.NET Core应用程序中记录Web API。我的应用程序不是ASP.NET,也不使用任何Web API。

c# trace .net-core

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

如何检查加密的S/MIME消息是否也已签名,而不对其进行解密

在加密此消息时,判断s/mime电子邮件是否使用附加签名进行签名的最简单方法(就计算资源而言)是什么?

如果邮件刚签名,则很容易.它有点像:

附加签名

   Content-Type: application/x-pkcs7-mime; smime-type=signed-data;
    name="smime.p7m"
Run Code Online (Sandbox Code Playgroud)

要么:

用于分离签名

   Content-Type: multipart/signed; protocol="application/x-pkcs7-signature";
    micalg=SHA1; boundary="----=_NextPart_000_00D2_01CD5850.61030BF0"
Run Code Online (Sandbox Code Playgroud)

在它的标题中.

但是当邮件被加密时,您无法判断它是否也已签名,因为两种情况的Content-Type标头相同(只是加密和加密/签名):

  Content-Type: application/x-pkcs7-mime;
    smime-type=enveloped-data;
    boundary="----=_NextPart_000_000D_01CDC82B.98454D80";
    name="smime.p7m"
Run Code Online (Sandbox Code Playgroud)

这是否意味着我必须解密消息只是为了告诉它是否也签名?现在,在我解密之前,似乎我甚至无法判断我的消息是否已签名(因为签名在加密数据中).或者,S/MIME加密和签名数据可能还有一些模式可以让我在没有解密的情况下区分加密/签名和加密/未签名数据(如果我没有解密证书,甚至可能这样做)?

email encryption smime digital-signature

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

.NET Core 2.0 SDK中的lib和ref文件夹中的.DLL有什么区别?

.NET Core 2.0 SDK中的每个DLL都有两个副本(它们具有不同的内容和文件大小).例如:

"c:\ Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions \net461\ref\System.Threading.Thread.dll"(14432 bytes)

"c:\ Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions \net461\lib\System.Threading.Thread.dll"(14352 bytes)

他们之间有什么区别(和两个人的目的)?

.net dll .net-core

7
推荐指数
1
解决办法
1698
查看次数

如何检查Windows注册表在.NET Core应用程序中是否可用?

我的.NET Core库需要从注册表中读取一些信息(如果可用),或者保留默认值(如果没有)。我想知道这样做的最佳做法。

我认为我可以将注册表初始化/使用代码块包装在try / catch中,也可以检查当前平台是否为Windows,但我不认为这些是最佳做法(最好避免出现异常,并且不能保证任何Windows-基于平台的将具有注册表等)。

现在,我将依靠

bool hasRegistry = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
Run Code Online (Sandbox Code Playgroud)

但想知道是否有更可靠/通用的解决方案。

c# registry .net-core

6
推荐指数
1
解决办法
2961
查看次数

在异步方法中最后一次异步调用需要等待吗?

当异步方法调用是我的异步方法中的最后一次调用时,我无法理解是否需要await语句.例如

public async Task CallAsync(byte[] data)
{
    await Call1Async(data);
    Call2Async(data);
}

public async Task Call1Async(byte[] data)
{
   ...
}

public async Task Call2Async(byte[] data)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

以上内容将编译,但警告"考虑应用等待此方法".但我认为应用等待该方法的最后一次调用会浪费资源.

与此同时,如果我使用return Call2Async(data);而不仅仅是Call2Async(data);,警告就会消失.这表明await在这种情况下实际上并不需要.

但这仅适用于具有返回值(即Task<T>而不仅仅是Task)的方法.我需要这个没有返回值的方法.有没有办法对价值回归方法做同样的事情?

即我需要以某种方式将返回的Task对象返回Call2Async给调用者,CallAsync并且我不能显式使用return语句,CallAsync因为我的方法没有返回值.当然,我可以调整它们以返回值(例如true),但这不是一个优雅的解决方案.

PS如果我的方法中只有异步调用,我只是不在方法签名中添加"async",并且它可以工作(不需要'return'语句).但是如果该方法包含多个异步调用,我需要'async'修饰符才能等待第一个调用'await Call1Async(data)'.并且添加"async"修饰符会使编译器需要"return"将Task对象返回给调用者(这仅适用于具有返回值的方法).这就是我想要克服的.

.net c# asynchronous

5
推荐指数
1
解决办法
1926
查看次数

.NET Core 中的 SignedCms 替代方案

.NET Core 中是否存在 System.Security.Cryptography.Pkcs.SignedCms 类的替代方案?还是我必须像在 WinRT 案例中那样深入研究 BouncyCastle?WinRT 中是否有 SignedCMS 的替代方案?

c# .net-core

5
推荐指数
2
解决办法
2262
查看次数

在UWP WebView控件中显示本地图像

我需要编写代码,将一些HTML(通过其他方式从外部源接收)加载到WebView中,并显示此HTML中引用的图像.这些图像将存储在Windows.Storage.ApplicationData.Current.LocalFolder中的某处.

使用本地图像的建议都没有显示在webview for windows phone 8.1使用Webbrowser控件中的本地图像为我工作.如果我用web.NavigateToString(html)加载这样的HTML:

<html><head></head><body>A <img src="file:///c:/Users/idh/AppData/Local/Packages/d783af9f-88eb-42f5-ab0f-abb025f32baa_5cy2zb9g43kb2/LocalState/folder/image001.jpg"> B</body></html>
Run Code Online (Sandbox Code Playgroud)

我只是显示了AB.我在文件:,ms-appx:和相对路径而不是文件:等之后尝试了斜杠和反斜杠,双斜线和三斜线.图像永远不会显示.同时,如果我将其保存在HTML文件中并在我的应用程序之外打开它,它显示正常.我还成功保存并阅读了这些文件(它们实际上出现在该文件夹中,因为我的应用程序创建了它们,因此未经授权的访问不是问题).package.manifest确实包括专用网络.

我最好不要使用嵌入式base64,自定义uri解析器和其他特殊技术,因为我不是应用程序的实际开发人员.我创建了一个获取HTML并将图像保存到本地存储的库,现在我需要演示一个易于使用的方法来可视化WebView中存储的内容,就像我之前为普通.NET框架所做的那样.即我实际上是为我的库用户的开发人员编写示例,然后这些人将使用我的示例处理此HTML和图像.

作为最后的手段,我最终可以为我的样本的UWP版本编写base64或自定义解析器(而对于像普通.NET框架这样的其他平台,相同的过程要容易得多).但我想至少确保在源HTML中为图像选择正确的URL的直接途径是不可能的,我不会最终得到一些情况,我写了一些相当复杂的东西,然后有经验的UWP应用程序揭示了我过度设计了一些东西.即一些专家意见"不,在UWP中不可能,你必须使用base64嵌入或自定义URI解析"对我也有用.

c# webview uwp

5
推荐指数
1
解决办法
1761
查看次数

如何在C#中为大型HTTP请求设置HttpWebRequest.Timeout

我没有得到如何处理HttpWebRequest.Timeout.之前,我曾经为Socket对象设置了直接的超时:Timeout设置发送或接收一大块数据的最大时间.但是,似乎HttpWebRequest.Timeout设置整个HTTP请求的超时.如果请求很大(例如,我正在使用HTTP PUT上传大文件),则可能需要数小时.这导致我设置:

...
request.Timeout = System.Threading.Timeout.Infinite;
Stream requestStream = request.GetRequestStream();
for (something)
{
  ...
  requestStream.Write(b, 0, b.Length);
}
Run Code Online (Sandbox Code Playgroud)

但是,这是不是意味着如果与服务器的网络连接卡住,我最终会遇到requestStream.Write从不抛出'Operation timed out'异常?那么超时的概念在这种情况下不起作用?

理想情况下,我希望.Timeout设置仅影响单个requestStream.Write.我可以根据需要使用尽可能多的Write(),前提是每个都不会超过.Timeout值.

或者我是否需要实现自己的基于Socket的机制来实现这一目标?

此外,在设置断点时,我发现requestStream实际上是具有.Timeout = 300000(300秒)的ConnectStream实例.这不意味着Infinite实际上并不是无限的并且限制在300秒之内吗?对于大文件和慢速连接,这是一个相当严格的限制.

c# sockets timeout http

4
推荐指数
1
解决办法
6562
查看次数

TcpClient.ConnectAsync或Socket.BeginConnect具有非阻塞超时设置

到目前为止,我发现的所有解决方案都基于WaitOne: 如何配置套接字连接超时生成工作线程

对我来说,用阻塞线程会WaitOne破坏异步方法的目的。生成另一个线程并不会好得多(因为异步模型会努力使用尽可能少的线程)。

还有其他解决方案仍然可以让我放弃连接尝试而不会阻塞当前线程或产生另一个线程吗?

我正在开发一个由外部代码使用的库,该库不知道我的库内部发生了什么(代码只调用了我的ConnectAsync方法,其余的工作TcpClient.ConnectAsync依此类推)。外部代码可以是任何内容(Web应用程序,桌面应用程序,Windows服务等)。理想情况下,除了设置类的.Timeout属性之外,该解决方案不应要求外部代码执行任何操作来终止操作。但是,如果这是实现自定义连接超时时避免块或工作线程的唯一方法,我将不胜感激,看看我有哪些选项(就异步/等待模型而言)。

.net c# sockets task-parallel-library async-await

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

EWS 托管 API 和 Exchange 2013 中的 Folder.WellKnownFolderName 为空

将 EWS 托管 API 与 Office 365 一起使用(ExchangeVersion.Exchange2013_SP1 配置文件)。当为父文件夹调用 Folder.FindFolders 时,对于所有返回的 Folder 对象(包括众所周知的文件夹,如收件箱),我将 Folder.WellKnownFolderName 值设为 null。.TotalCount 之类的其他值很好。

MSDN 中的 Folder.WellKnownFolderName 文档指出它应该适用于 Exchange2013 及更高版本,我相信 Office 365 符合此标准。

此外,如果我连接到 Exchange 2010 服务器并设置 ExchangeVersion.Exchange_2010 配置文件,.WellKnownFolderName 将引发异常而不是返回 null(这是预期的行为)。因此(以我的理解),根据版本,它应该为 Inbox 等知名文件夹抛出异常或返回非空值。

我错过了什么吗?

或者我应该使用其他方法来确定系统文件夹,如收件箱、已发送邮件等?

c# exchange-server office365 managed-ews

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