小编Joh*_*ohn的帖子

简化相对网址

我想知道是否其他人可以根据System.Uri标准.NET框架中可用的方法或其他方法,提出一种简化相对URL的更好方法。我的尝试有效,但是非常可怕:

public static String SimplifyUrl(String url)
{
    var baseDummyUri = new Uri("http://example.com", UriKind.Absolute);
    var dummyUri = new Uri(baseDummyUri , String.Join("/",
        Enumerable.Range(0, url.Split(new[] { ".." }, StringSplitOptions.None).Length)
                  .Select(i => "x")));

    var absoluteResultUri = new Uri(dummyUri, url);
    var resultUri = dummyUri.MakeRelativeUri(absoluteResultUri);
    return resultUri.ToString();
}
Run Code Online (Sandbox Code Playgroud)

例如,这给出了:

./foo -> foo
foo/./bar -> foo/bar
foo/../bar -> bar
Run Code Online (Sandbox Code Playgroud)

使它如此尴尬的问题是,Uri它本身似乎并没有简化相对的URL,而且MakeRelativeUri仅适用于绝对URL。因此,为了诱使Uri类执行我想要的操作,我构造了具有适当数量的嵌套的基本URL。

我也可以使用System.IO.Path,但是随后我必须搜索并替换反斜杠来斜杠...

必须有更好的方法,对吗?

.net c#

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

双向 Javascript window.postMessage - 调度顺序问题

postMessage 可用于在窗口之间发送消息,通常是从 iframe 到父级或从父级到 iframe。

postMessage 仅在一个方向上发送数据并且是外联的 - 不像函数调用,函数调用从调用返回值并内联执行(后者是前者的条件)。

为了将信息发送回“调用者”,“被调用者”必须自己做postMessage

现在让我们假设我想测试一个合适的监听器是否存在:我会postMessage根据一些约定,如果监听器存在,它会postMessage回来。

在什么时候我可以确定没有听众?我如何实现等待?

我在 IE11、Chrome 和 Firefox 上尝试了以下实验:

  1. postMessage 收到消息后立即回发的 iframe 窗口
  2. postMessage 自己的窗口作为在事件处理中调度未来点的一种手段

以下是这些步骤的代码:

var iframe = document.getElementById('iframe');
iframe.contentWindow.postMessage('hello', '*');
window.postMessage('schedule', '*')
Run Code Online (Sandbox Code Playgroud)

iframe 的响应代码是这样的:

window.addEventListener('message', function (event) {
    window.top.postMessage('echo ' + event.data, '*');
}, false);
Run Code Online (Sandbox Code Playgroud)

父窗口的侦听器本身是这样的:

var n = 0;
window.addEventListener("message", function (event) {
    if (n > 4) return;
    console.info(event.data);
    window.postMessage('(repeat of ' + event.data + ' #' + n + ')', …
Run Code Online (Sandbox Code Playgroud)

javascript xss iframe postmessage

6
推荐指数
0
解决办法
1196
查看次数

ASP.NET Core 中的自定义 IServiceProviderFactory

我编写了一个自定义IServiceProviderFactory并将其安装在Program.cs一个新应用程序中,如下所示:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new PropertyInjectingContainerFactory())
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
Run Code Online (Sandbox Code Playgroud)

它确实会导致调用正确的配置函数Startup.cs

   public void ConfigureContainer(PropertyInjectingContainerFactory.Builder builder)
   {
        builder.AddInjectAttribute<InjectDependencyAttribute>();
   }
Run Code Online (Sandbox Code Playgroud)

但是,我创建的容器仅解析两个服务:IConfigurationIHost​​ 。

其他所有内容显然都由默认容器解决(例如ILogger<T>控制器上的服务)。我做错了什么?

这是我的自定义工厂的代码 - 请理解我可能应该使用现有的第三方容器,但我也想了解这一切如何组合在一起。

public class PropertyInjectingContainerFactory : IServiceProviderFactory<PropertyInjectingContainerFactory.Builder>
{
    public Builder CreateBuilder(IServiceCollection services)
    {
        return new Builder(services);
    }

    public IServiceProvider CreateServiceProvider(Builder containerBuilder)
    {
        return containerBuilder.CreateServiceProvider();
    }

    public class Builder
    {
        internal readonly IServiceCollection services;

        internal List<Type> attributeTypes = new List<Type>();

        public Builder(IServiceCollection …
Run Code Online (Sandbox Code Playgroud)

dependency-injection .net-core asp.net-core

6
推荐指数
0
解决办法
1836
查看次数

无法在控制台应用程序中使用 AddHttpClient / IHttpClientBuilder

我有一些来自 Web 应用程序的代码,用于将 http 客户端配置为使用证书。我依靠IHttpClientBuilderAddHttpClient

我想使用相同的方法在控制台应用程序中进行测试,但我什至很难让这些类型在那里可用。

这里的文档说我可以Microsoft.Extensions.Hosting在控制台应用程序中使用(它用于初始化配置),但即使这个包应该依赖于Microsoft.Extensions.DependencyInjection上面的类型和方法应该存在的地方,编译器告诉我这些类型是未知的。

控制台应用程序是使用 .NET 6.0 全新创建的,其唯一的包引用位于Microsoft.Extensions.Hosting6.0.1。为什么不给我IHttpClientBuilder

编辑:

dotnet new console
dotnet add package Microsoft.Extensions.Hosting
Run Code Online (Sandbox Code Playgroud)

仅编辑Program.cs

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = Host.CreateDefaultBuilder(args);

host.ConfigureServices(services =>
{
    services.AddHttpClient(); // not found
});
Run Code Online (Sandbox Code Playgroud)

发现IHttpClientBuilder朋友仍然不在那儿。

.net-core .net-6.0

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

实体框架继承:按类型排序/分组?

实体框架(和 RIA 服务,我使用它)很好地支持继承。数据库映射可以是单表或多表,在第一种情况下,数据库表包括一个包含类型指示符的指示符列。

显然,这个指示符在模型中是不可见的,即使它是人们想要订购和分组的东西。

如果这是我想要做的,我是否必须在基类中引入一个额外的显式类型指示符,或者是否有更好的方法来以某种方式按类型排序或分组?

我正在使用 EF5。

entity-framework

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

而不是多个表的插入触发器

对于日志记录系统,我想拥有以下数据库模式:

CREATE TABLE [dbo].[Categories] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [App]      NVARCHAR (30)  NULL,
    [Source]   NVARCHAR (30)  NULL,
    [LogLevel] NVARCHAR (5)   NULL,
    [Logger]   NVARCHAR (120) NULL,
    CONSTRAINT [PK_Categories] PRIMARY KEY NONCLUSTERED ([Id] ASC),
    CONSTRAINT [UK_Categories] UNIQUE NONCLUSTERED ([App] ASC, [Source] ASC, [LogLevel] ASC, [Logger] ASC)
);

CREATE TABLE [dbo].[Occurences] (
    [PointInTime] BIGINT NOT NULL,
    [CategoryId]  INT    NOT NULL,
    [Noise]       INT    NOT NULL,
    CONSTRAINT [PK_Occurences] PRIMARY KEY CLUSTERED ([PointInTime] ASC, [CategoryId] ASC, [Noise] ASC),
    CONSTRAINT [FK_Category] FOREIGN KEY ([CategoryId]) …
Run Code Online (Sandbox Code Playgroud)

sql sql-server triggers

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

将表表达式传递给表参数化函数

我有以下用户定义的功能:

CREATE FUNCTION dbo.GetConcatenatedWithKeyAsInt32(@Values dbo.IndexValue READONLY)
RETURNS TABLE 
WITH SCHEMABINDING
AS 
RETURN (
  SELECT
  [Id],
   -- The definition of [Names] is not really important to this question!
  [Names] = stuff((
    select ', ' + Value
    from @Values AS xt
    where xt.Id = t.Id
    for xml path(''), TYPE
  ).value('.[1]','varchar(max)'), 1, 2, '')
  FROM @Values AS t GROUP BY t.Id);
Run Code Online (Sandbox Code Playgroud)

该参数是用户定义的表类型:

CREATE TYPE IndexValue AS TABLE ( Id int, Value VARCHAR(max) );
Run Code Online (Sandbox Code Playgroud)

我很难调用这个功能.

我找到了人们在实际的物理表(或视图)上调用这样一个函数的例子,但是肯定可以直接在select表达式中使用它,不是吗?

我试过了:

SELECT *
FROM dbo.GetConcatenatedWithKeyAsInt32(
  SELECT c.Id AS …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2

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

非持久性数据结构能否以纯粹的功能方式使用?

这是关于函数式编程的一般性问题,但我也对它在特定语言中的答案感兴趣.

我只有初学者对功能语言的了解,所以请耐心等待.

我的理解是,函数式语言把重点放在不同于命令式语言的数据结构上,因为它们喜欢不变性:持久性数据结构.

例如,它们都有一个不可变列表概念,您可以在其中形成新列表x :: l,y :: l从现有列表l和两个新项目x,y而不l需要复制所有元素.这可能是由新的列表对象实现的,内部指向旧的列表对象作为尾部.

在命令式语言中,很少使用这样的数据结构,因为它们不像c样式数组那样提供良好的引用局部性.

一般来说,找到支持功能风格的数据结构是它自己的努力,所以如果一个人不总是必须这样做会很棒.

现在,我们可以了解如何在函数式编程中使用所有经典数据结构,如果有合适的语言支持的话.

通常,命令式语言中的数据结构具有在其上定义的修改操作(伪代码):

data.modify(someArgument)
Run Code Online (Sandbox Code Playgroud)

写这个的功能方式是

newData = modified(data, someArgument)
Run Code Online (Sandbox Code Playgroud)

一般的问题是,这通常需要复制数据结构 - 除非语言能够知道data实际上不会被其他任何东西使用:然后,修改可以以改变原始的形式完成,没有人可以告诉区别.

有一大类案例,语言可以推断出"从未在别处使用过"的属性:当第一个参数为modified未绑定值时,如下例所示:

newData = modified(modified(data, someArgument))
Run Code Online (Sandbox Code Playgroud)

在这里,data可能会在别处使用,但modified(data, someArgument)显然不是.

这就是C++中被称为"rvalue"的东西,并且在C++的最新版本中,具有讽刺意味的是它根本不起作用,人们可以在这样的rvalues上重载.

例如,人们可以写:

Data modified(Data const& data) { // returns a modified copy }
Data modified(Data && data) { // returns the modified original }
Run Code Online (Sandbox Code Playgroud)

这意味着在C++中,实际上可以采用任何可变的高效数据结构并将其转换为具有不可变的api,可以以纯函数的方式使用,就像命令式版本一样有效.

(有一点需要注意,在C++中,有时候还需要强制转换rvalue.当然,需要注意实现这样的数据结构,即使用rvalue重载时.虽然可能会改进.)

现在我的问题:

实际的函数式语言是否有类似的机制?或者由于某些其他原因这不是必需的吗?

(我标记了一些我特别感兴趣的特定语言.)

f# haskell functional-programming scala

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

ASP.NET Core 和 Kestrel 设计决策:他们为什么使用 libuv?

我刚刚意识到 ASP.NET Core 应用程序不是纯粹的 CLR 应用程序——它们总是依赖于额外的二进制库:通过 Kestrel 的 libuv,或者可能不太常用的 http.sys。

我觉得这很令人惊讶,因为我原以为 .NET Core(以及 .NET Standard)下已经有足够的网络 api 来制作一个性能不错的 Web 服务器,纯粹在 .NET 中使用异步 IO - 但他们并没有走那条路.

所以:

  • 为什么使用 libuv 使东西更快?“因为异步 IO”本身并不能说明一切,因为 .NET 已经具备了这一点。
  • 为什么 Kestrel 没有在 .NET 的 IO 堆栈上运行的选项?在大多数情况下,速度差异不会那么重要,对吗?
  • 什么样的 IO 到底通过了性能更好的 libuv?我认为这只是入站请求。传出请求通过WebClientHttpRequest或者HttpClient不会用libuv,是否正确?

编辑:

我查看了 Kestrel 源代码,除了一个名为的程序集之外,Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv还有一个名为Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets. 套接字程序集的相应 NuGet 包仅处于预览状态。(当然,套接字程序集不依赖于 libuv。)

kestrel-http-server asp.net-core

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

合并后 Git 显示错误的作者

我很困惑地看到我的同事 Alice 在 git 日志中进行了合并提交,Bob 向我保证确实是他进行了合并。我没有看到鲍勃的其他合并提交,所以看起来爱丽丝以某种方式设法接管了鲍勃的提交。

Alice 确实也提交了一些东西,但她的提交活动很可能是在 Bob 之后的。Alice 仅通过 Visual Studio 的 git ui 使用 git。

我知道可以通过变基操作重写本地提交,但据我了解,通常不会对已推送的提交执行此操作。我认为图形化的 git ui 不会做任何不寻常的事情。

那么为什么我在 git 日志中看到 Alice 是作者和提交者呢?可能发生了什么原因导致这种情况?

编辑:其他提交有明智的作者,所以这不仅仅是配置了错误的用户名。

git

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