小编tym*_*tam的帖子

支持WebApi中的GET*和*POST

我们有一个测试模型.

public class TestRequestModel
{
    public string Text { get; set; }
    public int Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望这项服务能够接受以下请求:

  • GET/test?Number = 1234&Text = MyText
  • POST/test with header:Content-Type:application/x-www-form-urlencoded and body:Number = 1234&Text = MyText
  • 带标题的POST/test:Content-Type:application/json和body:{"Text":"提供!","数字":9876}

路由按以下方式配置:

_config.Routes.MapHttpRoute(
   "DefaultPost", "/{controller}/{action}",
   new { action = "Post" }, 
   new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });

_config.Routes.MapHttpRoute(
   "The rest", "/{controller}/{action}",
   defaults: new { action = "Get" });
Run Code Online (Sandbox Code Playgroud)

我的控制器看起来像这样:

public class TestController : ApiController
{
    [HttpGet]
    public …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api

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

确定在运行时序列化哪些属性

让我们假设我必须在级别中序列化Car类的对象,例如Internal和Public.公共级别中的某些属性不应序列化,因为它们是内部的.

在这个时候,我能想到的最简单的方法就是使用继承:

class CarPublic {
  public int PropX {get;set}
}

class CarInternal: CarPublic {
  public string PropY {get;set}
}
Run Code Online (Sandbox Code Playgroud)

然后我可以

object ToSerialize() {
 CarInternal car = GetCar();
 if( level == Level.Public ) { 
    return car as CarPublic;
 } else {
     return car;
 }
}
Run Code Online (Sandbox Code Playgroud)

ToSerialize()的结果由框架(我无法控制)并序列化为JSON或XML.

为简单起见,我省略了XML序列化属性.

这感觉就像一个黑客和黑客只带你到目前为止.有没有更好的方法(方式?)来实现这一目标?

我认为现在很清楚,但我想避免为JSON和XML编写自己的序列化方法.

在此先感谢Tymek

==编辑

为了澄清,我希望能够序列化多个级别:

class Car0 {
  public int PropA {get;set}
}

class Car1: Car0 {
  public string PropB {get;set}
}

class Car2: Car1 {
  public int PropC {get;set}
}

class Car3: Car2 …
Run Code Online (Sandbox Code Playgroud)

c# serialization

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

Doxygen并将一个属性值添加到输出文档中

ServiceStack使用c#属性标记Web服务的休息路径.

例如

[RestService("/hello1")]
[RestService("/hello2")]
public class Hello
Run Code Online (Sandbox Code Playgroud)

我想在Hello类的doxygen输出中使Doxygen包含RestService属性的值.如果带有括号的完整行包含在输出文档中,我并不太关心漂亮的formattin.

有什么建议?

一个快速而肮脏的技巧比编写Doxygen扩展更好;)

干杯

Tymek

====编辑

doxygen用户答案的Python版本(因此可以在Windows上轻松工作)将是:

#!/usr/bin/env python
import sys
import re

if (len(sys.argv) < 2):
    print "No input file"
else:
    f = open(sys.argv[1])
    line = f.readline()
    while line:
        re1 = re.compile("\[RestService\(\"(.*)\",.*\"(.*)\"\)]")
        re1.search(line)
        sys.stdout.write(re1.sub(r"/** \\b RestService: \2 \1\\n */\n", line))
        #sys.stdout.write(line)
        line = f.readline()
    f.close()
Run Code Online (Sandbox Code Playgroud)

并且DOXYFILE将具有:

INPUT_FILTER           = "doxygenFilter.py"
Run Code Online (Sandbox Code Playgroud)

c# documentation doxygen servicestack

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

如何在使用多个源表时重用"Where"的linq表达式

我们有以下内容:

public interface IOne {
    UInt64 Id { get; }
    Int16 Size { get; }
}

public interface ITwo {
    UInt64 OneId { get; }
    Int16 Color { get; }
}
Run Code Online (Sandbox Code Playgroud)

正如这里所解释的,重用linq表达式的方法是编写如下内容:

public static Expression<Func<IOne, bool>> MyWhereExpression( int value ){
    return (o) => (o.Size > value);
}

int v = 5;
IQueryable<IOne> records = from one in s.Query<IOne>()
                                        .Where(MyWhereExpression(v))
                           select one;
Run Code Online (Sandbox Code Playgroud)

当我想对两张桌子做同样的事情时,我遇到了一个问题.

表达方式:

public static Expression<Func<IOne, ITwo, bool>> MyWhereExpression2(int color ) {
    return (one,two) => (one.Id == two.OneId) …
Run Code Online (Sandbox Code Playgroud)

c# linq

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

以编程方式为ActiveDirectoryMembershipProvider设置connectionString

一个人可以使用

  new PrincipalContext(ContextType.Domain,null)
Run Code Online (Sandbox Code Playgroud)

没有为Active Directory提供任何连接字符串.

使用时ActiveDirectoryMembershipProvider,必须提供LDAP端点web.config.

我正在处理的网站将部署在多个网站上,我不想填写web.config每个deplyoment 的详细信息.

如何:在MSDN上的多个域中使用表单身份验证与Active Directory指定3个(!)成员资格提供程序来处理3个域,这些令人印象深刻.但是,这篇文章是从2005年开始的,它涉及的是我所追求的不同任务.

问题:

是否可以使用ActiveDirectoryMembershipProviderLDAP端点未在web.config中进行硬编码的方式?

我宁愿使用ActiveDirectoryMembershipProvider而不是PrincipalContext(可能)具有调用ChangePassword等的能力.

asp.net-membership active-directory

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

Newtonsoft.Json 在 .NET 5 / Core 和 .NET Framework 上的不同行为

以下程序在 .NET 5(或 .NET Core)和 .NET Framework 上运行时会产生不同的结果。

为什么行为不同?我不是在寻找反序列化问题的解决方案;我的目标是了解会发生什么。

class Versioned 
{
    public Version V {get; set;} = new Version(1,0);
}

static void Main(string[] args)
{
    // Serialised with version Newtonsoft.Json 9.0.1
    var json = "{\"V\":{\"Major\":2,\"Minor\":0,\"Build\":-1,\"Revision\":-1,\"MajorRevision\":-1,\"MinorRevision\":-1}}";

    Console.WriteLine($".NET: {System.Environment.Version}");
    Console.WriteLine($"Json.NET: {System.Reflection.Assembly.GetAssembly(typeof(Newtonsoft.Json.JsonConvert))}");

    Console.WriteLine(json);
    
    try 
    {
        var b = Newtonsoft.Json.JsonConvert.DeserializeObject<Versioned>(json);
        Console.WriteLine(b.V);
    } 
    catch (Exception ex) { Console.WriteLine(ex.GetBaseException().Message); }
}
Run Code Online (Sandbox Code Playgroud)

在 .NET 5 上:输出是(为了可读性而格式化):

.NET: 5.0.1
Json.NET: Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
{
    "V": {
        "Major": 2,
        "Minor": 0,
        "Build": -1,
        "Revision": -1,
        "MajorRevision": -1, …
Run Code Online (Sandbox Code Playgroud)

c# json.net .net-5

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

抑制单个编译器错误(例如 NU1603)

是否可以抑制 NuGet 错误的单个实例?

我得到了下面的 NU1603,我相信我无法解决这个问题,而且我不想抑制整个项目的所有 1603。

NU1603: runtime.native.System.IO.Compression 4.3.0 depends on runtime.win10-arm64.runtime.native.System.IO.Compression (>= 4.3.0) but runtime.win10-arm64.runtime.native.System.IO.Compression 4.3.0 was not found. An approximate best match of runtime.win10-arm64.runtime.native.System.IO.Compression 4.3.1 was resolved. NuGet package restore failed. Please see Error List window for detailed warnings and errors.

更新

重现该警告的步骤是:

  1. 创建一个新的 Win IoT Core 后台应用程序,目标为 16299。
  2. 添加 NuGet 引用Microsoft.Azure.Devices.Provisioning.Transport.Mqtt v1.1.1 (通过工具->NuGet 包管理器->管理解决方案的 NuGet 包...)
  3. 建造

尝试修复的额外步骤

添加对 System.IO.Compression 4.3.0(最新)的 NuGet 引用

项目文件现在包含

<PackageReference Include="System.IO.Compression"> <Version>4.3.0</Version> </PackageReference>

添加<NoWarn>

<PackageReference Include="System.IO.Compression"> …

msbuild visual-studio nuget

6
推荐指数
2
解决办法
9462
查看次数

'AsyncEnumerableReader' 在枚举值时达到了配置的缓冲区的最大大小

我正在使用返回 IAsyncEnumerable<> 的 async/await 方法从 SQL Server 数据库中检索行并通过 Web API .Net Core 3.0 接口提供它们。它工作正常,直到我超过 8192 行。对于超出该点的行,它会失败。我尝试了 3 个不同的表,每个表的行大小都非常不同。每次在产生 8192 行后发生故障。这是我看到的错误:

An unhandled exception occurred while processing the request.
InvalidOperationException: 'AsyncEnumerableReader' reached the configured maximum size of the buffer when enumerating a value of type 'Microsoft.EntityFrameworkCore.TestDatabase.TestDatabaseDbSet`1[TestNamespace.TestClass]'. This limit is in place to prevent infinite streams of 'IAsyncEnumerable<>' from continuing indefinitely. If this is not a programming mistake, consider ways to reduce the collection size, or consider manually converting 'Microsoft.EntityFrameworkCore.TestDatabase.TestDatabaseDbSet`1[TestNamespace.TestClass]' into a …
Run Code Online (Sandbox Code Playgroud)

c# async-await asp.net-core iasyncenumerable

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

在编译时已知不同类型的循环中调用泛型方法

让我们考虑一个接口中的方法:

public Interface IA {
    T[] Get<T>() where T : IB;
}
Run Code Online (Sandbox Code Playgroud)

在另一个地方,我想为编译时已知的n 种类型调用此方法 n 次。下面的代码说明了我的意图

foreach(Type t in new Type[] { typeof(X), typeof(Y), typeof(Z) }) 
{
    InterfaceXYZImplement[] arr = c.Resolve<IA>().Get<t>();
    //...more here
}
Run Code Online (Sandbox Code Playgroud)

现在,foreach循环显然使类型成为运行时值,因此我必须使用MakeGenericMethod.

有没有办法编写代码,让我可以为X,Y和执行代码Z,但只调用一次编写的方法?

将代码包装在方法中只会将问题向上移动(这是部分解决方案,但不是最终解决方案,呵呵)。

c# generics

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

单个LINQ to SQL查询中的SUM和COUNT

我正在尝试在LINQ-TO-SQL中创建以下查询。

select count(*), sum( o.CostInCents ) from Orders o
where Flag = true;
Run Code Online (Sandbox Code Playgroud)

我想出了以下LINQ查询:

var q = db.Orders
    .Where(o => o.Flag )

var result = q
    .GroupBy(o => 1)
    .Select(g => new MyDTO
    {
        NoOfOrders = g.Count(),
        TotalInCents = g.Sum(o => o.CostInCents )
    })
    .SingleOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

.GroupBy(o => 1)即使OK?

另一个选择是执行两个查询,如下所示。

var q = db.Orders
   .Where(o => o.Flag );

//No groupBy
var result2 = new MyDTO
{
    NoOfCostedOrders = q.Count(),//hit the db
    TotalInCents = q.Sum(o => o.CostInCents )//hit the …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-sql

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