小编Dr *_*ang的帖子

为什么HttpContext.Current在等待之后为null?

我有以下测试WebAPI代码,我没有在生产中使用WebAPI但我之所以这样做是因为我对这个问题进行了讨论:WebAPI异步问题

无论如何,这是违规的WebAPI方法:

public async Task<string> Get(int id)
{
    var x = HttpContext.Current;
    if (x == null)
    {
        // not thrown
        throw new ArgumentException("HttpContext.Current is null");
    }

    await Task.Run(() => { Task.Delay(500); id = 3; });

    x = HttpContext.Current;
    if (x == null)
    {
        // thrown
        throw new ArgumentException("HttpContext.Current is null");
    }

    return "value";
}
Run Code Online (Sandbox Code Playgroud)

我曾经相信第二个异常是预期的,因为当await完成时,它可能会在一个不同的线程上,HttpContext.Current因为线程静态变量将不再解析为适当的值.现在,基于同步上下文,实际上它可能会在等待之后被强制返回到同一个线程但我在测试中没有做任何奇特的事情.这只是一个简单,天真的用法await.

在另一个问题的评论中,我被告知HttpContext.Current在等待之后应该解决.对这个问题甚至还有另一个评论,表明同样的问题.什么是真的?应该解决吗?我想不,但我想要一个权威的答案,因为asyncawait是新的,我找不到任何确定的东西.

TL; DR:HttpContext.Current可能null在一个await

c# asp.net async-await asp.net-web-api

82
推荐指数
3
解决办法
4万
查看次数

如何在docker机器内外使用IdentityServer4?

我希望能够从docker机器外部和内部对Identity Server(STS)进行身份验证.

我在设置容器内外的正确权限时遇到问题.如果我将权限设置为内部名称,mcoidentityserver:5000则API可以进行身份​​验证,但客户端无法获取令牌,因为客户端位于docker网络之外.如果我将权限设置为外部名称,localhost:5000则客户端可以获取令牌,但API无法识别权限名称(因为localhost在这种情况下是主机).

我该如何设置权限?或许我需要调整码头网络?

红色箭头是我遇到麻烦的部分. 网络中的三个docker容器,一个客户端和PostgreSQL Admin,它们的端口和一个红色箭头显示我认为问题所在.

详情

我正在设置一个Windows 10 docker开发环境,它使用ASP.NET Core API(在Linux上),Identity Server 4(Linux上的ASP.NET Core)和PostgreSQL数据库.PostgreSQL不是问题,包含在图表中以保证完整性.它被映射到9876,因为我现在还在主机上运行了一个PostgreSQL实例.mco是我们公司的简称.

我一直在遵循Identity Server 4的说明来启动和运行.

我不包括docker-compose.debug.yml它,因为它运行的命令只与在Visual Studio中运行相关.

泊坞窗,compose.yml

version: '2'

services:
mcodatabase:
    image: mcodatabase
    build:
    context: ./Data
    dockerfile: Dockerfile
    restart: always
    ports:
    - 9876:5432
    environment:
    POSTGRES_USER: mcodevuser
    POSTGRES_PASSWORD: password
    POSTGRES_DB: mcodev
    volumes:
    - postgresdata:/var/lib/postgresql/data
    networks:
    - mconetwork

mcoidentityserver:
    image: mcoidentityserver
    build:
    context: ./Mco.IdentityServer
    dockerfile: Dockerfile
    ports:
    - 5000:5000
    networks:
    - mconetwork

mcoapi: …
Run Code Online (Sandbox Code Playgroud)

docker docker-compose identityserver4

22
推荐指数
2
解决办法
3631
查看次数

MVC ActionLink从当前url添加所有(可选)参数

非常有名的ActionLink:

 <%: Html.ActionLink("Back to List", "Index")%>
Run Code Online (Sandbox Code Playgroud)

现在,此链接位于我的详细信息视图中.索引视图是搜索页面.其URL如下所示:

http://localhost:50152/2011-2012/Instelling/Details/76?gemeente=Dendermonde&postcode=92**&gebruikerscode=VVKSO114421&dossiernr=114421%20&organisatie=CLB
Run Code Online (Sandbox Code Playgroud)

如你所见,相当多的参数.显然我想在返回索引页面时保留所有这些参数,所以我需要将它们添加到ActionLink.

现在,我已经厌倦了手动操作,它可以1,但不适用于6.这应该会更容易.

问题:如何将当前URL的所有参数都返回ActionLink为可选RouteValues.

我一直在寻找Request.QueryString.它必须是那样的东西.我在考虑编写一些静态方法Global.asax来完成工作,但还没有运气.也许有一种简单的方法可以做到这一点我不知道?

编辑:这是我想出的(哪个有效)

global.asax中:

    public static RouteValueDictionary optionalParamters(NameValueCollection c) {
        RouteValueDictionary r = new RouteValueDictionary();
        foreach (string s in c.AllKeys) {
            r.Add(s, c[s]);
        }
        return r;
    }
Run Code Online (Sandbox Code Playgroud)

Details.aspx:

    <%: Html.ActionLink("Back to List", "Index", MVC2_NASTEST.MvcApplication.optionalParamters(Request.QueryString))%>
Run Code Online (Sandbox Code Playgroud)

我最好把这段代码放在哪里?不是Global.asax我猜...

编辑2:

using System;
using System.Web.Mvc;

namespace MVC2_NASTEST.Helpers {
    public static class ActionLinkwParamsExtensions {
        public static MvcHtmlString CustomLink(this HtmlHelper helper, …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc actionlink routevalues

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

JwtSecurityTokenHandler和TokenValidationParameters

我以前有一个参考Microsoft.IdentityModel.Tokens.JWT,一切都很好.

我更新了使用新的System.IdentityModel.Tokens.Jwt但现在似乎没有任何工作.它不能找到ValidateToken的方法JwtSecurityTokenHandlerTokenValidationParameters没有AllowedAudience,SigningTokenValidateExpiration性质.

我在这里错过了什么?任何人都可以提供JWT验证的工作样本吗?

我的"旧"代码:

private static void ValidateJwt(string jwt)
{
    var handler = new JWTSecurityTokenHandler();
    var validationParameters = new Microsoft.IdentityModel.Tokens.JWT.TokenValidationParameters()
    {
        AllowedAudience = "https://my-rp.com",
        //SigningToken = new BinarySecretSecurityToken(Convert.FromBase64String(myBase64Key)),
        SigningToken = new X509SecurityToken(
           X509
           .LocalMachine
           .My
           .Thumbprint
           .Find("UYTUYTVV99999999999YTYYTYTY88888888", false)
           .First()),
        ValidIssuer = "https://my-issuer.com/trust/issuer",
        ValidateExpiration = true
    };

    try
    {
        var principal = handler.ValidateToken(jwt, validationParameters);
    }
    catch (Exception e)
    {

        Console.WriteLine("{0}\n {1}", e.Message, e.StackTrace);
    }

    Console.WriteLine(); …
Run Code Online (Sandbox Code Playgroud)

c# security validation identity jwt

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

谷歌地图; 将地方卡添加到标记

正如您在下图所示,div(左上角)显示当前标记地址/ directions/save ..

在此输入图像描述

这是使用iframe谷歌地图的嵌入代码完成的.但是你怎么能用自定义的"编码"地图做同样的事情呢?

geocoder = new google.maps.Geocoder();

geocoder.geocode({
    "address": nw.google_pointer
}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {

        var myOptions = {
            zoom: parseInt(nw.google_zoom),
            center: results[0].geometry.location,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

        var marker = new google.maps.Marker({
            map: map,
            position: results[0].geometry.location,
            title: nw.google_pointer
        });
    } else {
        console.log('Geocode was not successful for the following reason: ' + status);
    }
});
Run Code Online (Sandbox Code Playgroud)

javascript google-maps google-maps-api-3

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

忽略EF Core中的表列

我正在创建一个使用EF Core的绿地应用程序,它必须与旧数据库通信.我希望EF忽略数据库中的某些列,因为它们最终会被弃用,我不希望它们出现在新的实体模型中.我无法删除它们,因为遗留系统仍然依赖于它们.

对于调用的不需要的数据库列DeprecatedFeature,我想做类似的事情:

modelBuilder.Entity<MyEntity>(entity => {
   entity.HasKey(t => t.Id);
   entity.ToTable("MyEntity");
   entity.ColumnIgnore("DeprecatedFeature"); // <-- this is what I want to do
})
Run Code Online (Sandbox Code Playgroud)

现在,我能做的最好的事情就是包含该属性并将其标记为过时:

public class MyEntity 
{
    public int Id { get; set; }

    [Obsolete("Deprecated in latest version")]
    public string DeprecatedFeature { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但这意味着我无法将"警告视为错误".我仍然需要在我的数据库上运行迁移.

类似的问题:加载EF 4.x,EF Core跳过列,使用EF Designer/EDMX复制

编辑

我可以从答案中看出,我的问题存在一些混乱:

NotMapped不是答案

NotMapped当您在模型中拥有您不希望在数据库中拥有的属性时使用.我的问题是另一种方式.我的数据库中有一列我不希望在我的模型中.

c# entity-framework entity-framework-core

11
推荐指数
2
解决办法
8230
查看次数

为什么Contains()返回false但是在列表中包装并且Intersect()返回true?

问题:

当我使用Contains()针对IEnumerable<T>的是正确地实现类IEquatable和覆盖GetHashCode返回false.如果我将匹配目标包装在列表中并执行,Intersect()则匹配正常.我更愿意使用Contains().

IEnumerable.Contains()MSDN:

使用默认的相等比较器将元素与指定值进行比较

EqualityComparer<T>.Default物业从MSDN:

Default属性检查类型T是否实现System.IEquatable泛型接口,如果是,则返回使用该实现的EqualityComparer.否则返回一个EqualityComparer,它使用由T提供的Object.Equals和Object.GetHashCode的覆盖.

据我所知,IEquatable<T>在我的类上实现应该意味着Equals在尝试查找匹配时默认比较器使用该方法.我想使用Equals,因为我希望只有一种方式,两个对象是相同的,我不想要开发人员必须记住的策略.

我觉得奇怪的是,如果我将匹配目标包装在a中List然后执行a ,则Intersect匹配被正确找到.

我错过了什么?我是否必须创建一个相等比较器,如MSDN文章?MSDN建议有IEquatable足够的东西,会包装给我.

控制台应用示例

NB:GetHashCode()来自Jon Skeet

using System;
using System.Collections.Generic;
using System.Linq;

namespace ContainsNotDoingWhatIThoughtItWould
{
    class Program
    {
        public class MyEquatable : IEquatable<MyEquatable>
        {
            string[] tags;

            public MyEquatable(params string[] tags)
            {
                this.tags = tags;
            }

            public …
Run Code Online (Sandbox Code Playgroud)

.net c# linq

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

如何解决SyntaxError:JSON.parse:ajax和php中JSON数据的第1行第1列的意外字符

如何解决这个错误: SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

我正在向ajax和php发送一些数据.

这是我的ajax代码:

flag = 111;
var dt = $(this).serializeArray();
dt.push({
  name: 'flag',
  value: flag
});

$.ajax({
  url: 'emp.php',
  type: "post",
  async: true,
  data: dt,
  dataType: 'html',
  contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
  success: function(data) {
    var x = JSON.parse(data); //THIS Line shows error!!
    alert(x);
    $('#name').val(x.ename);
    $('#designation').val(x.designation);
    $('#department').val(x.department);
    $('#sd').val(x.secdivision);
  },
  error: function(jqXHR, textStatus, errorThrown) {
    console.log(textStatus, errorThrown);
  }
});
Run Code Online (Sandbox Code Playgroud)

这是我的PHP:

$empid = (isset($_POST['employeeid'])) ? $_POST['employeeid'] : 'NOT';
$flag  = (isset($_POST['flag'])) …
Run Code Online (Sandbox Code Playgroud)

php ajax jquery

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

AWS IAM Bool 与 BoolIfExists

我无法理解AWS IAM 策略条件Bool之间的差异。BoolIfExists有人可以解释一下吗?

前任:

"Condition" : {"BoolIfExists" : {"aws:MutliFactorAuthPresent" : false}}

"Condition" : {"Bool" : {"aws:MutliFactorAuthPresent" : false}}
Run Code Online (Sandbox Code Playgroud)

amazon-web-services amazon-iam

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

EF 7迁移到现有数据库

我正在使用ASP.Net 5和EF7开发一个Web项目.

我已将现有数据库中的所有表导入到项目中的模型中.但是,我在迁移方面遇到了问题.

我创建了初始迁移,对特定实体进行了一些更改,根据我所做的更改创建了另一个迁移,现在想要在数据库上应用更改.

运行以下命令后:

dnx ef database update [Migration]

dnx试图对已经在数据库中的所有实体应用"初始"迁移,这会导致如下错误:

{数据库中已经有一个名为['EntityName']的对象.}

您能否就如何在现有数据库上进行迁移提出建议?

谢谢赛义德

ef-migrations entity-framework-core asp.net5

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