小编Muh*_*eed的帖子

使用async/await并从ASP.NET Web API方法返回Task <HttpResponseMessage>

我有一个像这样的可移植类库(PCL)方法:

public async Task<string> GetLineStatuses()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
    using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
    {
        return response.GetResponseStream().ReadAllText();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的ASP.NET Web Api方法如下所示:

public async Task<HttpResponseMessage> Get()
{
    HttpResponseMessage response = new HttpResponseMessage();
    string statuses = await service.GetStatuses();
    response.Content = new StringContent(statuses);
    return response;
}
Run Code Online (Sandbox Code Playgroud)

在Web API中返回Task有什么含义.这是允许的吗?我想使用await的唯一原因是我可以使用可移植类库(PCL).什么是最佳做法?我应该有我的方法的同步版本和异步版本吗?什么是性能和代码可读性和可维护性含义?

如果我回来Task<string>而不是,我也会有同样的效果Task<HttpResponseMessage>吗?

.net c# task-parallel-library async-await asp.net-web-api

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

使用CompositionScopeDefinition在MEF中定义范围

在我的应用程序的根目录中,我有一个AggregateCatalog和一个CompositionContainer,如下所示:

AggregateCatalog aggregateCatalog = new AggregateCatalog();
CompositionContainer compositionContainer = new CompositionContainer(aggregateCatalog);
Run Code Online (Sandbox Code Playgroud)

我的应用程序加载了包含多个导出的模块,如下图所示.我想使用CompositionScopeDefinition来确定图中圈出的导出范围.

模块导出图

请参阅此处了解类定义.

// Create CompositionScopeDefinition.
TypeCatalog globalParts = new TypeCatalog(typeof(RequestListener));
TypeCatalog scopedParts = new TypeCatalog(typeof(RequestHandler), typeof(DataAccessLayer), typeof(Logger), typeof(DatabaseConnection));
CompositionScopeDefinition compositionScopeDefinition = new CompositionScopeDefinition(
    globalParts,
    new[] { new CompositionScopeDefinition(scopedParts, null) });

// Register CompositionScopeDefinition.
aggregateCatalog.Catalogs.Add(compositionScopeDefinition);

// Create an instance of RequestListener.
RequestListener requestListener = compositionContainer.GetExportedValue<RequestListener>();
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下异常:

发生System.ComponentModel.Composition.ImportCardinalityMismatchException消息=未找到与约束匹配的导出:ContractName MyNamespace.RequestListener RequiredTypeIdentity MyNamespace.RequestListener InnerException:

如何使用CompositionScopeDefinition将我的作用域导出添加到现有的AggregateCatalog并使用我现有的CompositionContainer初始化它们?

更新

似乎使用AggregateCatalog的问题.如果我将CompositionScopeDefinition直接添加到CompositionContainer,一切正常,但这阻止我将其他目录添加到CompositionContainer.

.net c# prism mef .net-4.5

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

在ASP.NET MVC 6中更新NuGet包

我刚刚创建了一个新的ASP.NET MVC 6项目,并希望将NuGet包更新到最新版本(默认项目模板通常非常过时).我注意到以下更新是可能的:

  • Antlr.3.4.1.9004> Antlr.3.5.0.2
  • Newtonsoft.Json.6.0.4> Newtonsoft.Json.6.0.8
  • WebGrease.1.5.2> WebGrease.1.6.0

当我尝试使用NuGet包对话框升级这些软件包或更新newhostoft.json的project.json文件中的版本号时,我收到错误.

1)严重性代码描述项目文件行错误未实现(HRESULT异常:0x80004001(E_NOTIMPL))0

2)严重性代码描述项目文件行错误NuGet包恢复一个或多个包失败.在"输出"窗口中查看详细信息 Mvc6ProjectName C:[路径到我的文件夹]\Source\Mvc6ProjectName\project.json 0

3)严重级代码描述项目文件行错误依赖项Newtonsoft.Json> = 6.0.8无法解析Mvc6Boilerplate C:\ Git\ASP.NET-MVC-Boilerplate\Source\MVC6\Mvc6Boilerplate\project.json 19

我也有一个MVC项目,我在那里使用最新的NuGet包,为什么我不能升级这些包呢?这是否与没有更多web.config文件的事实有关,我们可以在其中指定运行时assemblyBinding:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
      <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)

更新1

当我尝试从包管理器控制台更新Newtonsoft.Json时,我收到以下错误:

PM> Update-Package Newtonsoft.Json -ProjectName Mvc6Boilerplate -Version 6.0.8包含Id'Newtoftoft.Json'的包未安装到项目'Mvc6Boilerplate'.

似乎Newtonsoft.Json没有安装在默认的MVC 6项目中,而是作为另一个项目的依赖项安装.此NuGet包实际上并未显示在Nuget包管理器中,但显示在project.json文件中,也显示在References-> DNX和DNX Core树视图项下.

当我尝试显式安装Newtonsoft.Json包时,它确实升级到6.0.8但我得到了上面列出的错误.

c# asp.net asp.net-mvc nuget asp.net-core-mvc

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

如何使用project.json(.xproj)在项目中设置默认命名空间

在标准中,.csproj您可以进入属性并设置默认命名空间.如何在.xproj项目中实现project.json

project .net-core project.json asp.net-core

9
推荐指数
2
解决办法
4242
查看次数

在Linux上使用Mono构建VS 2017 MSBuild csproj项目

我正在尝试使用最新的Mono和.NET Core 1.0.1工具(基于MSBuild的csproj工具)在Mac和Linux上使用Travis CI构建.NET Core项目.他们瞄准netstandard1.6.1,net45net461.我从Travis CI得到的错误是:

/usr/share/dotnet/sdk/1.0.1/Microsoft.Common.CurrentVersion.targets(1111,5):错误MSB3644:找不到框架".NETFramework,Version = v4.5"的引用程序集.要解决此问题,请为此框架版本安装SDK或Targeting Pack,或者将应用程序重新定位到已安装SDK或Targeting Pack的框架版本.请注意,程序集将从全局程序集缓存(GAC)中解析,并将用于代替引用程序集.因此,您的程序集可能无法正确定位到您想要的框架.

Mono不支持基于VS 2017 MSBuild的csproj项目吗?如何构建我的项目?

msbuild mono travis-ci .net-core asp.net-core

9
推荐指数
2
解决办法
2816
查看次数

JSON 中 Duration 的好格式是什么?

我意识到 JSON 没有真正的日期格式,考虑到 JavaScript 使用的是 ISO 8601,因此使用 ISO 8601 是一个不错的选择。持续时间呢?JavaScript 没有内置格式。

  1. 我遇到了ISO 8601 持续时间,例如P3Y6M4DT12H30M5S我在野外没有看到太多使用。它看起来也非常冗长且难以阅读。据我所知,如果您需要,它也不支持毫秒。
  2. 我正在使用 C#,其TimeSpan类型输出1.02:03:04.0050000为 1 天、2 小时、3 分钟、4 秒和 5 毫秒。
  3. 我可以使用秒数或毫秒数作为整数。这完全是机器可读的,如果您使用秒或毫秒而不标记值,这并不明显。

我几乎从未见过野外的第一种格式。第二个对我来说似乎更直观,但我担心它在 .NET 之外并不为人所知。第三种格式可能是最跨平台友好的,但完全不是人类可读的。

.net time timespan duration iso8601

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

Kubernetes秘密卷与环境变量

有推荐的使用Kubernetes Secrets的方法吗?它们可以作为环境变量或使用卷安装公开。一个比另一个更安全吗?

environment-variables kubernetes docker-volume kubernetes-security kubernetes-secrets

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

Azure 服务主体创建应用程序需要什么角色或范围

我当前使用 Azure CLI 创建服务主体:

az ad sp create-for-rbac --name foo --role Contributor

我需要服务主体拥有足够的权限来创建/修改/删除各种 Azure AD 资源,包括应用程序、其他服务主体和服务主体密码。当我使用上述服务主体创建其他服务主体时,我当前收到 403 Forbidden 错误。

我还尝试过使用“所有者”和“用户访问管理员”角色,但仍然出现 403 错误。我需要向上述 Azure CLI 命令添加哪些内容,或者需要添加哪些其他角色分配?

我想在 Pulumi 程序中使用其 Azure AD 提供程序(基于 Terraform 的 Azure AD 提供程序)的服务主体。看:

https://github.com/pulumi/pulumi-azureread/issues/246

azure azure-active-directory terraform pulumi azure-service-principal

9
推荐指数
2
解决办法
7963
查看次数

显示ASP.NET Core MVC的404找不到页面

我正在使用下面的中间件来为HTTP状态代码400到599设置错误页面。因此访问将/error/400显示400 Bad Request错误页面。

application.UseStatusCodePagesWithReExecute("/error/{0}");

[Route("[controller]")]
public class ErrorController : Controller
{
    [HttpGet("{statusCode}")]
    public IActionResult Error(int statusCode)
    {
        this.Response.StatusCode = statusCode;
        return this.View(statusCode);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,访问会/this-page-does-not-exist导致出现“未找到IIS 404”的一般错误页面。

有没有办法处理不匹配任何路由的请求?在IIS接管之前,如何处理此类请求?理想情况下,我想将请求转发给/error/404我,以便我的错误控制器可以处理它。

在ASP.NET 4.6 MVC 5中,我们必须使用Web.config文件中的httpErrors部分来执行此操作。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" />
      <error statusCode="404" responseMode="ExecuteURL" path="/error/404/" />
    </httpErrors>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

c# asp.net iis asp.net-core-mvc asp.net-core

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

PresentationFramework Aero,Aero2或AeroLite

我想写一个快速的WPF应用程序,但我发现它在Windows 7上与Windows 10相比看起来完全不同.所有的填充和边距都搞砸了.我决定添加默认的PresentationFramework.Aero Windows 7主题,希望这可以解决问题.但是,似乎还有两个新选择:

  • PresentationFramework.Aero.dll

在.NET 4.5中,Microsoft引入了两个额外的程序集:

  • PresentationFramework.AeroLite.dll
  • PresentationFramework.Aero2.dll

我使用哪一个来获得一致的外观和感觉,包括Windows 7,8和10中的填充和边距.

c# wpf windows-7 windows-8 windows-10

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