小编Dan*_*.G.的帖子

如何在Azure中允许URL编码的路径段

我有一个在Azure中运行的ASP.NET 6 MVC应用程序.我有一个像这样的动作的控制器

[HttpDelete]
[Route("{image_url}")]
public async Task<IActionResult> RemoveImageUrl([FromRoute(Name = "image_url")] String imageUrlString)
Run Code Online (Sandbox Code Playgroud)

然后我称之为

api/https%3A%2F%2Frepocreator.zoltu.io%2Fimages%2FZoltu-Logo-Full-Size.png"
Run Code Online (Sandbox Code Playgroud)

使用Kestrel进行自托管时,此应用程序正常工作,但是一旦部署到Azure,我就会收到500个错误.我已尽可能多地调试,经过大量的谷歌搜索和戳戳后,似乎IIS正在尝试帮助URL解码请求,然后将其转发给ASP.NET来处理.当然,问题是即使我可以说服IIS接受请求

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true" />
    </security>
</system.webServer>
<system.web>
    <httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="" relaxedUrlToFileSystemMapping="true"/>
    <pages validateRequest="false" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

它仍然解码URL并将解码后的URL传递给ASP.NET,后者找不到匹配的路由.

我该怎么做才能告诉IIS停止尝试在这里提供帮助,只是传递它获得的任何URL,而不进行任何类型的预验证或重写?注意:这是一个Azure Web App,因此我无法直接访问IIS设置.

iis azure azure-web-sites asp.net-core-mvc asp.net-core

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

使用MVC和ASP.Net Core重写动态URL

我正在用ASP.Net Core和MVC 6重写我的FragSwapper.com网站(目前在Asp 2.0中!),我正在尝试做一些我通常需要打破URL重写工具和db代码的东西和一些重定向,但我想知道是否有一个"更好"的方法在ASP.Net核心可能与MVC路由和重定向.

这是我的场景......

  • URL访问网站:[root]

    怎么做:转到通常的[Home] Controller和[Index] View(没有[ID]).......它现在这样做:

    app.UseMvc(routes =>
    {
      routes.MapRoute(
      name: "default",
      template: "{controller=Home}/{action=Index}/{id?}");
    });
    
    Run Code Online (Sandbox Code Playgroud)
  • URL访问该站点:[root]/ControllerName/... yada yada ...

    怎么做:转到控制器等...这一切都有效.

  • 棘手的一个:URL访问网站:[root]/SomeString

    怎么做:访问数据库并做一些逻辑来决定我是否找到了一个事件ID.如果我这样做,我会转到[事件]控制器和[索引]视图和我找到的任何[ID].如果不是,我尝试找到主机ID并转到[Home] Controller和[Organization] View with THAT [ID]我找到了.如果我没有找到并且事件或主机转到通常的[Home] Controller和[Index] View(没有[ID]).

这里的大问题是我想在2个不同的控制器中重定向到三个完全不同的视图之一.

所以底线是我想在用户访问我网站的根目录时做一些逻辑,并且在其上有一个"/ Something",并且该逻辑是数据库驱动的.

如果您理解了这个问题,您现在就可以停止阅读......如果您觉得需要理解为什么需要所有这些逻辑,您可以继续阅读以获取更详细的背景信息.

我的网站基本上有两种模式:查看事件而不查看事件!通常一次运行4或5个事件,但大多数用户只对一个事件感兴趣,但每4个月左右就会发生一次不同的事件.我有一个[主机]实体,每个主机每年最多可举办4个事件, 一次一个.大多数用户只关心一个主机的事件.

我试图避免让用户总是去事件地图并找到事件并点击它,因为我有限制我可以显示地图的次数(免费),而且它实际上没有必要.用户在我的网站上99.99%的时间他们在事件屏幕上,而不是我的主屏幕,并且一次只对一个事件感兴趣.在将来我想编写代码,如果他们来到我的网站,他们就可以直接参加他们的活动或者他们最喜欢的主机上的新活动,这样我就可以避免大量的点击并将我的[Home]控制器页面集中在newbs上......但我还没有自动登录工作,所以这是后来的.

但是现在我希望主机总是为他们的活动提供相同的网址:FragSwapper.com/ [Host Abbreviation] ...并且知道它总会转到他们当前的活动,每4个月有一个不同的ID!

疯狂......我知道......但技术上很容易做到,我只是不知道如何在MVC中正确地完成这些工作.

asp.net-mvc asp.net-mvc-routing url-redirection asp.net-core-mvc asp.net-core

11
推荐指数
1
解决办法
9989
查看次数

Asp.net 5(vnext)准备好了吗?

Asp.net 5(vnext)准备好了吗?我刚刚下载了VS社区版本,我正在尝试使用asp.net 5 API但它缺少文档.

有谁知道在哪里可以找到关于创建asp.net 5 Web应用程序的好文档?

asp.net-mvc asp.net-core-mvc asp.net-core

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

如何动态更改 MVC 注册的 Bundle Collection 项

我希望在我的 MVC 网站发布后,例如通过点击按钮,可以动态更改注册的捆绑包集合项目(JS 或 CSS 文件)。有可能吗?我们应该怎样做才能实现这一目标?

任何帮助表示赞赏。

c# collections asp.net-mvc bundle

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

针对同一元素的多个标记助手

我刚刚注意到,如果我有2个标记助手,它们都是针对同一个元素的,那么两者都可以执行.它们的执行顺序取决于它们在_ViewImports.cshtml中的注册顺序.

例如,我可以为anchor元素创建另一个标记助手:

[HtmlTargetElement("a", Attributes = "foo")]
public class FooTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        //Get the url from href attribute generated in the default AnchorTagHelper
        var url = output.Attributes["href"].Value.ToString();

        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

使用如下(注意我也添加了默认锚点助手的属性asp-controller):

<a class="menu" asp-controller="Home" asp-action="Index" foo>Foo</a>
Run Code Online (Sandbox Code Playgroud)

如果在默认的ASP 之后在_ViewImports.cshtml中注册了此助手:

  • 每当Process调用时,TagHelperOutput已经包含默认生成的hrefAnchorTagHelper.我也可以用我喜欢的任何方式更新默认标签助手生成的锚点.

对这种行为有任何程度的控制吗?

您可能想要决定是否执行针对同一元素的其他帮助程序(如同密封输出一样).您可能还希望允许其他帮助程序,但请确保未修改某些属性.

asp.net-mvc asp.net-core-mvc asp.net-core

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

使用sinon使用必需的参数声明特定的存根调用

假设您正在测试一个函数,该函数将使用不同的参数多次调用依赖项:

var sut = {
    ImportantFunction: function(dependency){
        dependency("a", 1);
        dependency("b", 2);
    }
};
Run Code Online (Sandbox Code Playgroud)

使用QUnit + Sinon 并假设调用的顺序并不重要,我可以编写以下测试,确保函数按预期调用依赖项:

test("dependency was called as expected", function () {
    var dependencyStub = sinon.stub();

    sut.ImportantFunction(dependencyStub);

    ok(dependencyStub.calledTwice, "dependency was called twice");            
    sinon.assert.calledWith(dependencyStub, "a", 1);
    sinon.assert.calledWith(dependencyStub, "b", 2);
});
Run Code Online (Sandbox Code Playgroud)

但是,如果订单很重要并且我希望测试将其考虑在内,该怎么办?使用QUnit + Sinon编写此类测试的最佳方法是什么?

我使用了以下方法,但是我正在丢失由sinon断言提供的描述性失败消息(显示预期值和实际值).为此,我只是手动添加了一些描述性消息,但它没有使用具有预期值和实际值的失败消息(并且必须手动维护).

ok(dependencyStub.firstCall.calledWith("a", 1), "dependency called with expected args 'a', 1");
ok(dependencyStub.secondCall.calledWith("b", 2), "dependency called with expected args 'b', 2");
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以sinon.assert.calledWith像第一次或第二次呼叫那样使用特定呼叫的断言?

这个小提琴的样本设置

unit-testing qunit sinon

3
推荐指数
2
解决办法
5749
查看次数

Change component view location in Asp.Net 5

On ASP.NET 5 a Component view must be in one of two places:

Views/NameOfControllerUsingComponent/Components/ComponentName/Default.cshtml
Views/Shared/Components/ComponentName/Default.cshtml
Run Code Online (Sandbox Code Playgroud)

Is there a way to change this to:

Views/NameOfControllerUsingComponent/Components/ComponentName.cshtml
Views/Shared/Components/ComponentName.cshtml
Run Code Online (Sandbox Code Playgroud)

So basically, remove the folder ComponentName and change the view name from Default.cshtml to ComponentName.cshtml.

For me it makes more sense ... Is it possible?

asp.net-core-mvc asp.net-core

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