小编Ras*_*usW的帖子

C#中的泛型函数声明

我正在尝试创建一些关于库中方法调用持续时间的统计信息.我想创建一个执行这些重复步骤的通用操作和函数,而不是将每个方法调用包装到包含时间线的库并跟踪它.

例如,对于不返回值的方法,我创建了这个:

    private readonly Action<string, Action> timedAction = (name, action) =>
    {
        var sw = Stopwatch.StartNew();
        action.Invoke();
        trackDuration(name, sw.ElapsedMilliseconds);
    };
Run Code Online (Sandbox Code Playgroud)

可以调用timedAction("methodname", () => lib.methodname()).

我想为返回值的方法做类似的事情,但显然Action不能用于此目的,因为它不能返回值.

有没有办法用泛型来做到这一点Func,所以我不必为每个库方法参数组合声明一个?

c# generics

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

为何以及何时使用多态?

我是OOP的新手,多态性让我很难过:

class Animal
{
    public virtual void eat()
    {
        Console.Write("Animal eating");
    }
}
class Dog : Animal
{
    public override void eat()
    {
        Console.Write("Dog eating");
    }
}
class Program
{
    public void Main()
    {
        Animal dog = new Dog();
        Animal generic = new Animal();
        dog.eat();
        generic.eat();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样打印

Dog eating
Animal eating
Run Code Online (Sandbox Code Playgroud)

但是为什么不使用Dog类型代替动物,比如Dog dog = new Dog()?当你知道这个物体是一种动物,但我不知道它是什么样的动物时,我认为这很方便.请向我解释一下.

谢谢

c# oop polymorphism

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

.NET Core 3无法加载ECC私钥

通过在.NET中加载ECC私钥,我能够将ECC私钥加载到.NET Core 3中,并执行签名任务。

但是,我遇到了一个不能由加载的密钥ECDSA.ImportPrivateKey。奇怪的是,通过将其openssl更改为.NET Core 3 可以理解的键字节来进行查看

导入失败的私钥的代码(这是失败的实际密钥):

ecdsa = ECDsa.Create();
var pem = "MHYCAQEEH5t2Xlmsw5uqw3W9+/3nosFi6i3V901uW6ZzUpvVM0qgCgYIKoZIzj0DAQehRANCAASck2UuMxfyDYBdJC0mHNeToqMBhJuMZYSgkUNbK/xzD7e3cwr5okPx0pZdSMfDmyi1dBujtIIxFK9va1bdVAR9";
var derArray = Convert.FromBase64String(pem);
ecdsa.ImportECPrivateKey(derArray, out _);
Run Code Online (Sandbox Code Playgroud)

ImportECPrivateKey呼叫失败,System.Security.Cryptography.CryptographicException : ASN1 corrupted data内部System.Security.Cryptography.EccKeyFormatHelper.FromECPrivateKey(ReadOnlyMemory`1 keyData, AlgorithmIdentifierAsn& algId, ECParameters& ret)

原始PEM文件如下所示:

$ cat private_key_cert_265.pem
-----BEGIN EC PRIVATE KEY-----
MHYCAQEEH5t2Xlmsw5uqw3W9+/3nosFi6i3V901uW6ZzUpvVM0qgCgYIKoZIzj0D
AQehRANCAASck2UuMxfyDYBdJC0mHNeToqMBhJuMZYSgkUNbK/xzD7e3cwr5okPx
0pZdSMfDmyi1dBujtIIxFK9va1bdVAR9
-----END EC PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

openssl将私钥转换为其他内容:

$ openssl ec -in private_key_cert_265.pem
read EC key
writing EC key
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIACbdl5ZrMObqsN1vfv956LBYuot1fdNblumc1Kb1TNKoAoGCCqGSM49 …
Run Code Online (Sandbox Code Playgroud)

c# cryptography elliptic-curve .net-core-3.0

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

.NET XmlSerializer 和多维数组

我正在实施一个程序,该程序充当某些现有软件的客户端。该协议是使用XML模式定义的,它包括多维数组。

.netXmlSerializer无法处理这些 -这是一个已知问题

有没有办法扩展XmlSerializer以便我可以对此进行处理,或者是否有完整的(免费或商业的)替代品XmlSerializer可以处理多维数组?

SharpSerializer 似乎没有创建模式定义的 XML,而是使用它自己的序列化格式。

我想我可以sgen.exe用来生成序列化程序代码,然后手动编辑它以添加必要的处理,但我想避免这种情况。

.net c# xml xsd xmlserializer

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

使用图API API在Azure Active Directory中创建应用程序失败

我正在尝试使用Azure Active Directory图谱API(使用Azure GraphClient nuget包)在Azure AD中创建新应用程序.

我使用现有的AAD应用程序进行了身份验证,因此我对该目录具有写入权限.

但是,在创建新的应用程序对象时,Azure Graph API会返回以下错误:

{"odata.error": {
  "code":"Request_BadRequest",
    "message": {
      "lang":"en",
      "value":"Property  value cannot have duplicate id or claim values."
    },
    "values":
      [{
        "item":"PropertyName",
        "value":"None"
       },
       {
         "item":"PropertyErrorCode",
         "value":"DuplicateValue"
       }
     ]
   }
 }
Run Code Online (Sandbox Code Playgroud)

它没有说明哪个属性具有重复的id或声明值 - 错误消息中有两个空格,就好像缺少名称一样.

创建Application对象的代码是这样的:

var appname = "Test Application create " + DateTime.Now.Ticks;
var application = new Application()
        {
            AvailableToOtherTenants = false,
            DisplayName = appname,
            ErrorUrl = null,
            GroupMembershipClaims = null,
            Homepage = "http://www.domain.com",
            IdentifierUris = new List<string>() {{"https://domain.com/"+ appname } }, …
Run Code Online (Sandbox Code Playgroud)

c# azure-active-directory azure-ad-graph-api

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

将自定义标头添加到Azure Functions响应

我正在使用Azure Function App(v2),该程序在同一Function App中具有许多不同的功能。

它将被部署在多个Azure区域中,我想添加一个自定义标头,以指示哪个区域满足了请求。

我知道我可以让每个函数返回HttpResponseMessage包含自定义标头的函数。我不想将代码复制到每个功能中,而是希望将其集中在整个Function App项目中。返回的另一个缺点HttpResponseMessage是我想使用IActionResult,因此可以使用JsonResultOkObjectResult和类似的返回类型。

对于ASP.NET MVC项目,我可以添加一个添加了标题的中间件,或者使用来添加标题web.config。在功能应用程序中似乎都不可行。

如何做到这一点而不必HttpResponseMessage在每个函数的Run方法内返回并添加标头?

azure azure-functions

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

在 .NET 中加载 ECC 私钥

我有一个 ECC 私钥和一个包含公钥的证书文件。我可以以 PEM 或 DER 格式获取它们。

我可以X509Certificate使用以下代码将证书读入:

var certbytes = File.ReadAllBytes("certificate.pem");
var cert = new X509Certificate2(certbytes);
Run Code Online (Sandbox Code Playgroud)

但我无法加载私钥。我试过这个代码:

var keyContent = File.ReadAllBytes("certificate_private_key.pem");
var key = CngKey.Import(keyContent, CngKeyBlobFormat.EccPrivateBlob);
Run Code Online (Sandbox Code Playgroud)

它抛出Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'An error occurred during encode or decode operation'.

我还尝试了该CngKeyBlobFormat参数的其他值。Import 方法也失败了。

openssl 可以读取该文件,并输出有关它的以下信息:

var certbytes = File.ReadAllBytes("certificate.pem");
var cert = new X509Certificate2(certbytes);
Run Code Online (Sandbox Code Playgroud)

.NET 或 .NET Core 中是否有可以执行此操作的内置 API?或者是否有可以做到这一点的 3rd 方图书馆,以及如何做到这一点?

c# cryptography x509certificate2

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

使用 OutDir 时,每个目标框架的子文件夹中的 MSBuild 输出

使用新的 SDK 样式 csproj 格式时,可以使用<targetframeworks>分号分隔的目标框架列表元素来构建项目。

这会导致构建输出文件夹中的每个目标框架都有一个子文件夹:

构建输出文件夹结构

但是,当在 msbuild 命令行上传递 OutDir 属性时,它不会创建子文件夹,并且构建的程序集都放置在同一文件夹中。

命令行有效,但不允许输出位置:

msbuild projectfile.csproj

选择输出目录,但将构建的程序集放在同一文件夹中的命令行(有效地覆盖首先构建的目标框架程序集):

msbuild projectfile.csproj /p:OutDir=buildtemp

有没有办法将构建输出放置在非默认文件夹中,同时仍保留 targetframwork 子文件夹?

msbuild visual-studio-2017

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

当右表中没有数据时,使用 LEFT JOIN 选择 JSON 返回单元素数组

我正在将一些数据从 MS SQL Server 数据库导出为 JSON。

有两张表,从表A到表B都有外键。是0多关系,即。表 A 中的一条记录可能在表 B 中有一些数据,但不是必须的。表 A 包含人员记录,表 B 是他们当前和以前的地址的列表。

我使用此语句来获取 JSON 数据:

SELECT
    A.Firstname,
    A.LastName,
    HistoricAddresses.AddressLine1
    HistoricAddresses.AddressLine2
FROM
    People A
LEFT JOIN
    HistoricAddresses ON HistoricAddresses.PeopleId = A.Id
FOR JSON AUTO
Run Code Online (Sandbox Code Playgroud)

这会产生如下所示的 JSON 结构:

[
    {
        "Firstname": "xyz",
        "Lastname": "xyz",
        "HistoricAddresses": [
            {
                "AddressLine1": "abc",
                "AddressLine2": "abc"
            },
            // more historic address records follow
        ]
    },
    // more records follow
]
Run Code Online (Sandbox Code Playgroud)

这一切都很好,直到 A 表中的一条记录在 B 表中没有任何记录为止。在这种情况下,JSON 如下所示:

[
    {
        "Firstname": "xyz",
        "Lastname": "xyz",
        "HistoricAddresses": [ …
Run Code Online (Sandbox Code Playgroud)

sql-server json

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

ARM 模板数组参数

我有一个带有 Web 应用程序警报规则的 ARM 模板,我希望能够在其中配置哪些电子邮件收到警报。

电子邮件警报操作的片段如下:

"action": {
    "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleEmailAction",
    "sendToServiceOwners": false,
    "customEmails": [
        "email1@example.com",
        "email2@example.com"
    ]
}
Run Code Online (Sandbox Code Playgroud)

相同的模板用于设置生产、测试​​和开发环境。所以我想使用一个参数来进行电子邮件警报。

"customEmails"如何基于逗号分隔字符串或数组类型参数生成用作属性的数组?

我已经尝试过了"customEmails": "[array(parameters('AlertEmailRecipients'))]",也

"customEmails": [
    [array(parameters('AlertEmailRecipients'))]
]
Run Code Online (Sandbox Code Playgroud)

但两者都不起作用。我不知道如何告诉它“customEmails”属性值应该来自参数。

arrays azure azure-rm-template

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