我正在使用ODataConventionModelBuilder为Web API OData服务构建Edm Model,如下所示:
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "X";
builder.ContainerName = "Y";
builder.EntitySet<Z>("Z");
IEdmModel edmModel = builder.GetEdmModel();
Run Code Online (Sandbox Code Playgroud)
Z类位于一个组件中,并且存在来自Z的公共类Q位于不同的组件中.
ODataConventionModelBuilder将生成包含类Q(以及其他派生类)定义的Edm Model,并将使用服务元数据公开它.在我们的案例中这是不可取的.
当派生类无法访问(例如定义为内部)这样的问题时,肯定不存在.
有没有办法强制ODataConventionModelBuilder不自动公开所有派生类型的元数据?
我正在尝试使用 PowerShell 的类,这是一种非常方便的将相关数据分组在一起的方法,并且在处理行为方面非常繁琐。简化方案:一个定义类的 PS 脚本和另一个使用该类的脚本。
通用.ps1
class X
{
[string] $A
}
Run Code Online (Sandbox Code Playgroud)
脚本1.ps1
. $PSScriptRoot\Common.ps1
[X] $v = New-Object X
Run Code Online (Sandbox Code Playgroud)
一切都很好-你可以运行Script1.ps1没有问题的次任意数量的-直到你做出任何的改变Common.ps1。您将面临以下错误。
无法将“X”类型的“X”值转换为“X”类型。
在 D:\temp\PSIssue\Script1.ps1:3 字符:1
+ [X] $v = 新对象 X
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullQualifiedErrorId:运行时异常
可以想象,PS 文件中的任何更改(即使您只是添加了空格)都会强制其重新编译,因此该类型X变得与以前不同X- 临时容器程序集已更改(同样的问题在 .NET 中很容易重现 - 类型与只要“完全限定的程序集名称”相同)。变化Script1.ps1使事情恢复正常。
有没有办法克服这类问题?
考虑以下我将同步等待的异步方法。等一下,我知道。我知道这被认为是不好的做法并导致死锁,但我完全意识到这一点,并采取措施通过用Task.Run包装代码来防止死锁。
private async Task<string> BadAssAsync()
{
HttpClient client = new HttpClient();
WriteInfo("BEFORE AWAIT");
var response = await client.GetAsync("http://google.com");
WriteInfo("AFTER AWAIT");
string content = await response.Content.ReadAsStringAsync();
WriteInfo("AFTER SECOND AWAIT");
return content;
}
Run Code Online (Sandbox Code Playgroud)
这段代码肯定会死锁(与SyncronizationContext环境-它就像ASP.NET单个线程调度任务),如果调用这样的:BadAssAsync().Result。
我面临的问题是,即使使用这个“安全”包装器,它仍然偶尔会出现死锁。
private T Wait1<T>(Func<Task<T>> taskGen)
{
return Task.Run(() =>
{
WriteInfo("RUN");
var task = taskGen();
return task.Result;
}).Result;
}
Run Code Online (Sandbox Code Playgroud)
这些“WriteInfo”行是故意的。这些调试行让我看到它偶尔发生的原因是 中的代码Task.Run,有些神秘,是由开始服务请求的同一个线程执行的。这意味着它具有 AspNetSynchronizationContext 作为SyncronizationContext并且肯定会死锁。
这是调试输出:
***(工作正常) 开始:TID:17;SCTX:System.Web.AspNetSynchronizationContext;调度程序:System.Threading.Tasks.ThreadPoolTaskScheduler 运行:TID:45;SCTX:<null> 调度程序:System.Threading.Tasks.ThreadPoolTaskScheduler 等待之前:TID:45;SCTX:<null> 调度程序:System.Threading.Tasks.ThreadPoolTaskScheduler 等待后:TID:37;SCTX:<null> 调度程序:System.Threading.Tasks.ThreadPoolTaskScheduler 第二次等待后:TID:37;SCTX:<null> 调度程序:System.Threading.Tasks.ThreadPoolTaskScheduler ***(死锁) 开始:TID:48;SCTX:System.Web.AspNetSynchronizationContext;调度程序:System.Threading.Tasks.ThreadPoolTaskScheduler …
我发现关于渐近复杂性存在很多争议List.Add().我怀疑它的来源是最糟糕的情况导致底层数组调整大小并且逻辑上是O(n)操作.但是,每次列表空间不足时,阵列的大小会增加两倍.这使n元素所需的调整大小成比例log(n).
这是不是意味着Add平均情况下操作的渐近复杂性会是O(n/log(n))什么?
真正的基准List.Add()是在下面.然而,基准测试并不能真正表达这种操作 - 在任何偏离直线(对数刻度)线变得可见之前,我们可能会耗尽内存.
我们假设我已经定义了如下Func:
Func<MyClass, object> f = o => o.StringProperty;
Run Code Online (Sandbox Code Playgroud)
要么
Func<MyClass, object> f = o => o.Property.SomeMethod();
Run Code Online (Sandbox Code Playgroud)
是否有办法获得实际的返回类型而无需专门调用它?
在一项研究中,this重新分配可能性与结构的目的我遇到了以下难题:为什么需要this = default(...)在一些结构构造函数的开头做.它实际上是零已经归零的内存,不是吗?
查看.NET核心的示例:
public CancellationToken(bool canceled)
{
this = default(CancellationToken);
if (canceled)
{
this.m_source = CancellationTokenSource.InternalGetStaticSource(canceled);
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道如何发送会议请求以允许GMail正确识别它?
如果您尝试发送iCalendar会议请求定义作为替代视图,使用习惯代码(也通过下面给出)通过MailMessage对象GMail,将导致未被识别的会议请求:

但是通过GMail UI发送的具有完全相同的会议请求的邮件会导致公认的会议请求!令人费解.

有人知道我错过了什么"魔法"吗?
很高兴注意到Outlook正确识别了给定代码发送的完全相同的会议请求.

使用会议请求发送邮件的代码:
class Program
{
static string From = "sender@example.com";
static string TimeFormat = "yyyyMMdd\\THHmmss\\Z";
static string To = "target@example.dom";
static void Main(string[] args)
{
string content = ReadFile("event-template.ics");
content = content.Replace("#TO#", To);
content = content.Replace("#FROM#", From);
content = content.Replace("#UID#", Guid.NewGuid().ToString().Replace("-", ""));
content = content.Replace("#CREATED-AT#", DateTime.UtcNow.AddDays(-1).ToString(TimeFormat));
content = content.Replace("#DTSTART#", DateTime.UtcNow.AddDays(1).ToString(TimeFormat));
content = content.Replace("#DTEND#", DateTime.UtcNow.AddDays(1).AddHours(1).ToString(TimeFormat));
MailMessage message = new MailMessage();
message.From = new MailAddress(From);
message.To.Add(new MailAddress(To));
message.Subject = "Meeting Request …Run Code Online (Sandbox Code Playgroud) 我们正在使用ASP.NET Web API 2并希望以下列方式公开部分编辑某些对象的能力:
HTTP PATCH /customers/1
{
"firstName": "John",
"lastName": null
}
Run Code Online (Sandbox Code Playgroud)
...设置firstName来"John"和lastName到null.
HTTP PATCH /customers/1
{
"firstName": "John"
}
Run Code Online (Sandbox Code Playgroud)
......为了以防更新firstName到"John",不碰lastName的.假设我们有许多我们想要用这种语义更新的属性.
这是由OData行使的非常方便的行为.
问题是默认的JSON序列化器null在两种情况下都会出现,因此无法区分.
我正在寻找一些方法来使用某种包装器(带有值和标志设置/未设置)来注释模型,这样可以看到这种差异.任何现有的解决方案?
我们假设我们使用OAuth承载令牌来保护我们的API.有一个带有OWIN中间件的NuGet包可以为我们做这些:https://www.nuget.org/packages/Microsoft.Owin.Security.OAuth .
Everethig看起来很棒,直到提出有关访问令牌到期的问题 - 我们不想强制使用重复登录一遍又一遍.据我了解,有三种基本方法:
我很好奇是否有可能创建一个端点,该端点需要即将到期的访问令牌,只需使用新的访问令牌来模拟OAuth访问令牌的滑动过期类型?
我们在 iPhone 6 (A1586) 上播放受 AES(使用 JWT 令牌身份验证)保护的视频时遇到问题。欠费错误如下:
\n\n\n\n\n0x50300000 - 视频播放因损坏问题而中止\n或因为视频使用了您的浏览器不支持的功能
\n
当禁用加密时,播放相同的视频不会出现任何问题。
\n\n问题是,Azure Media Player 团队发布的复制此类场景的示例也不起作用,并且失败并出现完全相同的错误!此处提供: https: //ampdemo.azureedge.net/。该样本命名如下:
\n\n\n\n\nAES(JWT 令牌)\xe2\x80\x93 点播 [钢铁之泪预告片]
\n
如何通过 iPhone 上的 Azure 媒体服务/播放器进行受保护的视频流?它完全支持场景吗?
\n\n以下是设置传递策略的相关代码:
\n\n deliveryPolicy = context.AssetDeliveryPolicies.Create(\n DeliveryPolicyName,\n AssetDeliveryPolicyType.DynamicEnvelopeEncryption,\n AssetDeliveryProtocol.SmoothStreaming | AssetDeliveryProtocol.Dash | AssetDeliveryProtocol.HLS,\n new Dictionary<AssetDeliveryPolicyConfigurationKey, string>\n {\n { AssetDeliveryPolicyConfigurationKey.EnvelopeKeyAcquisitionUrl, contentKey.GetKeyDeliveryUrl(ContentKeyDeliveryType.BaselineHttp).ToString() }\n }\n );\nRun Code Online (Sandbox Code Playgroud)\n c# ×9
.net ×2
asp.net ×2
algorithm ×1
asynchronous ×1
azure ×1
bearer-token ×1
class ×1
deadlock ×1
email ×1
encryption ×1
expression ×1
gmail ×1
icalendar ×1
iphone ×1
lambda ×1
oauth ×1
odata ×1
outlook ×1
patch ×1
powershell ×1
reflection ×1