我们有一个测试模型.
public class TestRequestModel
{
public string Text { get; set; }
public int Number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望这项服务能够接受以下请求:
路由按以下方式配置:
_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) 让我们假设我必须在级别中序列化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) 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) 我们有以下内容:
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) 一个人可以使用
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等的能力.
以下程序在 .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) 是否可以抑制 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.
更新
重现该警告的步骤是:
Microsoft.Azure.Devices.Provisioning.Transport.Mqtt v1.1.1
(通过工具->NuGet 包管理器->管理解决方案的 NuGet 包...)尝试修复的额外步骤
添加对 System.IO.Compression 4.3.0(最新)的 NuGet 引用
项目文件现在包含
<PackageReference Include="System.IO.Compression">
<Version>4.3.0</Version>
</PackageReference>
添加<NoWarn>
<PackageReference Include="System.IO.Compression"> …
我正在使用返回 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) 让我们考虑一个接口中的方法:
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,但只调用一次编写的方法?
将代码包装在方法中只会将问题向上移动(这是部分解决方案,但不是最终解决方案,呵呵)。
我正在尝试在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# ×8
linq ×2
.net-5 ×1
asp.net-core ×1
async-await ×1
doxygen ×1
generics ×1
json.net ×1
linq-to-sql ×1
msbuild ×1
nuget ×1
servicestack ×1