小编Nic*_*cht的帖子

将文件返回到ASP.NET MVC中的查看/下载

我在ASP.NET MVC中将存储在数据库中的文件发送回用户时遇到问题.我想要的是一个列出两个链接的视图,一个用于查看文件并让发送给浏览器的mimetype确定应该如何处理,另一个用于强制下载.

如果我选择查看调用的文件SomeRandomFile.bak并且浏览器没有关联的程序来打开这种类型的文件,那么我没有问题,它默认为下载行为.但是,如果我选择查看调用的文件,SomeRandomFile.pdf或者SomeRandomFile.jpg我希望文件只是打开.但是我也希望将下载链接保留在一边,这样无论文件类型如何,我都可以强制下载提示.这有意义吗?

我已经尝试过FileStreamResult它适用于大多数文件,它的构造函数默认不接受文件名,因此根据url(根据内容类型不知道要提供的扩展名)为未知文件分配文件名.如果我通过指定强制文件名,我将失去浏览器直接打开文件的能力,我得到一个下载提示.有人遇到过这种情况么.

这些是我迄今为止尝试过的例子.

//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);
Run Code Online (Sandbox Code Playgroud)

//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);
Run Code Online (Sandbox Code Playgroud)

//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};
Run Code Online (Sandbox Code Playgroud)

有什么建议?

c# asp.net-mvc download http-headers asp.net-mvc-3

284
推荐指数
5
解决办法
33万
查看次数

服务器端声称使用Owin身份验证进行缓存

我有一个过去常用的应用程序,FormsAuthentication不久之前我将其切换为使用IdentityModelfrom,WindowsIdentityFramework以便我可以从基于声明的身份验证中受益,但使用和实现它相当难看.所以现在我在看OwinAuthentication.

我在看OwinAuthenticationAsp.Net Identity框架.但是Asp.Net Identity框架目前唯一的实现是使用EntityModel和我正在使用nHibernate.所以现在我想尝试绕过Asp.Net Identity并直接使用Owin Authentication.我终于能够使用" 我如何忽略身份框架魔法并使用OWIN auth中间件来获取我所寻求的声明? "中的提示进行工作登录,但现在我持有声明的cookie相当大.当我使用时,IdentityModel我能够使用服务器端缓存机制来缓存服务器上的声明,而cookie只是为缓存的信息保存了一个简单的令牌.是否有相似的功能OwinAuthentication,或者我必须自己实现它?

我希望我会参加其中一艘船......

  1. cookie保持3KB,哦,它有点大.
  2. 启用类似于IdentityModelSessionCaching的功能Owin,我不知道.
  3. 编写我自己的实现来缓存导致cookie膨胀的信息,看看我是否可以Owin在应用程序启动时配置它.
  4. 我这样做是错的,有一种我没有想过的方法,或者我在滥用某些东西Owin.

    public class OwinConfiguration
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = "Application",
                AuthenticationMode = AuthenticationMode.Active,
                CookieHttpOnly = true,
                CookieName = "Application",
                ExpireTimeSpan = TimeSpan.FromMinutes(30),
                LoginPath = "/Login",
                LogoutPath = …
    Run Code Online (Sandbox Code Playgroud)

asp.net authentication claims-based-identity owin

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

在VS2010中使用带有IIS Express的端口80

我有一个应用程序,我试图在VS2010的IIS Express下我的开发系统上运行,我需要使用端口80,但我无法让它工作.我正在查找有关端口80被保留的信息. http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/

但即便这样做,我仍然从vs2010那里得到一个错误,上面写着 "无法启动IIS Express Web服务器.端口'80'正在使用中."

我不知道还有什么可以尝试的.我使用Process Hacker来跟踪端口80,它似乎是通过System运行进程ID 4 来使用的,这是NT内核和系统进程.我不知道这是否会阻止我使用该端口.我想也许这是因为http.sys持有该端口所以没有别的可以使用它?

我通过修改C:\Users\[MyUser]\Documents\IISExpress\config\applicationhost.config文件的默认绑定设法让IIS Express在端口80上运行,虽然我可以通过这种方式手动启动IIS Express,然后VS会因为该端口上已存在绑定而收到错误.所以我把它改回8080,使用VS2010中的按钮创建虚拟目录(我猜这与输入网站绑定相同)但是当我去调试应用程序时仍然会出错.在VS2010中是否有硬编码的东西不允许它在端口80上启动IIS Express?

更新和修复:好的,所以我发现了一些要检查的东西,我确实解决了我的问题,但并不完全.一篇文章建议确保我没有安装SQL报告服务,因为它可以在端口80上监视,我曾经安装但不再安装它并不是我遇到的问题.但我确实意识到我安装了WebDeploy.它与Web Platform Installer中的VS2010 SP1捆绑包捆绑在一起.这很好,因为我确实需要来自WebDeploy的客户端工具,但它也在我的系统上安装了代理,该代理正在端口80上进行监控.我进入了我的服务列表并停止了Web Deploy Agent Service.在我这样做的时候,我现在可以在VS2010中使用端口80用于IIS Express.

与在IIS Express中运行端口80相关的新问题 然而我的应用程序是一个MVC3应用程序,我遇到了一个问题,因为MVC3根本没有捕获我的请求,所以它没有触发我的控制器操作或类似的东西,但我的应用程序的根目录中的txt文件可以到达所以我知道它是我的网站,IIS Express正在提供.任何人都有任何问题在端口80上的IIS Express中运行MVC3(我不知道它是否独占于MVC3)?

asp.net-mvc http visual-studio-2010 iis-express asp.net-mvc-3

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

MVC3 EditorTemplate使用RadioButtons获得可以为空的布尔值

我在我的一个对象上有一个属性,它是一个可以为空的布尔值,我希望我的逻辑有真正的表示是,假为是否为零,而为零则为零.现在因为我将在许多不同的对象上拥有这样的多个属性,所以最有意义的是为这些属性创建编辑器和显示模板.我将使用jQuery UI来应用buttonset的可视元素,但这一切都有效,但是现在,这超出了我的问题范围.我的编辑器模板看起来像这样.

@model bool?
<div data-ui="buttonset">
@Html.RadioButtonFor(x => x, true, new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "Yes"}) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))Yes">Yes</label>
@Html.RadioButtonFor(x => x, false, new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "No" }) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))No">No</label>
@Html.RadioButtonFor(x => x, "null", new { id = ViewData.TemplateInfo.GetFullHtmlFieldId("") + "NA" }) <label for="@(ViewData.TemplateInfo.GetFullHtmlFieldId(""))NA">N/A</label>
</div>
Run Code Online (Sandbox Code Playgroud)

我的问题是,在任何情况下我都无法使用此编辑器模板来正确显示模型的当前值.因为我没有在此范围内呈现模型的属性而是模型本身,所以MVC3中的内置逻辑将不会正确设置checked属性,因为检查是为了验证名称不为空或为null(请参阅MVC3) source,InputExtensions.cs:第#259行).我无法通过与模型进行比较来动态设置checked属性,因为浏览器会检查有关已检查属性是否存在值的单选按钮,因此即使我的单选按钮看起来如下所示,最后一个按钮仍然是选中的.

<div class="span-4" data-ui="buttonset">
<input checked="checked" id="MyObject_BooleanValueYes" name="MyObject.BooleanValue" type="radio" value="True" /><label for="MyObject_BooleanValueYes">Yes</label>
<input checked="" id="MyObject_BooleanValueNo" name="MyObject.BooleanValue" type="radio" value="False" /><label for="MyObject_BooleanValueNo">No</label>
<input checked="" id="MyObject_BooleanValueNA" name="MyObject.BooleanValue" type="radio" value="null" /><label for="MyObject_BooleanValueNA">N/A</label>
</div><span class="field-validation-valid" data-valmsg-for="MyObject.BooleanValue" …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc mvc-editor-templates asp.net-mvc-3

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

在ASP.NET MVC Core项目中使用View内部的C#7功能

我已经找到了与此相关的其他问题,但似乎没有一个我正在寻找的东西.

我有一个在ASP.NET Core上运行的网站,其中包含VS2017中的新项目结构.使用C#7功能的代码文件编译正常.但是,尝试在View中使用这些功能会导致一系列有关语法的错误.我尝试安装Roslyn以便在编译视图时使用它,因为我可以告诉我可以在Roslyn nuget包2.x及更高版本中使用C#7功能.但现在我得到明确说明的反馈

错误CS8059:功能'输出变量声明'在C#6中不可用.请使用语言版本7或更高版本.

在过去,我会检查web.config,但是在ASP.NET核心项目中没有web.config,而是根目录中的几乎空的,用于处理来自IIS的请求.

我如何表明我的视图应该用Roslyn编译,因为直到运行时才能完成?至少我认为这会解决我的问题.

编辑: 这个问题并不重复,正如我在开始时提到的那样,我也在寻找现有的问题.这是在编译时在您的应用程序中专门启用C#7功能,并且仅适用于ASP.NET应用程序.我正在使用ASP.NET Core,它没有web.config,其中定义了任何编译设置.另外,我正在尝试为在运行时编译的视图执行此操作,并且可能在不同的系统上.

解:

对于任何感兴趣的人,你必须将Roslyn添加到你的项目(我知道),但你还必须配置RazorViewEngineOptions使用CSharpParseOptions它来指示语言版本(默认为6).我做到了这一点,但我没有正确地做到这一点.我需要指定WithLanguageVersion()后退的结果ParseOptions来替换它们.

services.AddMvc().AddRazorOptions(options => options.ParseOptions = options.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7));
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core c#-7.0

14
推荐指数
1
解决办法
3122
查看次数

具有完整框架的ASP NET Core 2

我无法找到在完整框架下运行的ASP.NET MVC Core应用程序的任何文档或示例.它应该得到支持,但正如我所说,我找不到任何关于如何为此配置项目的文档,并且无法自己解决.

有没有人有这个工作,可以提供有关需要做什么的建议/样品?

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

13
推荐指数
1
解决办法
4335
查看次数

有关使用重写的AuthorizeAttribute,线程安全,ChildActions和缓存的MVC3的自定义安全设置的问题

因此,在为我的MVC3应用程序寻找强大的安全解决方案后,我发现了Rick Anderson的这篇博客文章.它详细介绍了一个WhiteList方法,其中AuthorizeAttribute的自定义实现被应用为全局过滤器,并且您要使用虚拟属性AllowAnonymousAttribute来装饰您希望允许匿名访问的操作/控制器(我说虚拟因为AllowAnonymousAttribute中没有逻辑,所以它是只是一个空的属性类)

bool allowAnnonymous = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true);
if (allowAnnonymous) return;
Run Code Online (Sandbox Code Playgroud)

这(以及他的博客上提到的其他安全建议,如HTTPS)为我提供了一个默认的安全模型,我不需要对每个操作都应用安全检查,并且还要记住将其添加到将来的功能添加中.

问题的第一部分

现在,我没有使用AuthorizeAttribute上的Users/Roles属性,我需要从数据库中获取这些东西.对我而言,这是AuthorizeCore中的内容,因为它唯一的责任是返回一个真假,用户是否有权访问.但是我有一个问题,根据我对AuthorizeAttribute类的源代码的读取,AuthorizeCore必须是线程安全的,我不确定访问我的数据库以确定用户权限并坚持这一点的最佳方法.我的应用程序正在使用IoC,目前让我的IoC容器注入我的存储库处理AuthorizeAttribute的构造函数,但是通过这样做然后在AuthorizeCore中访问它,我不会导致线程安全问题吗?或者我正在使用IoC实现和MVC3 DependencyResolver为我的自定义AuthorizeAttribute构造函数提供参数是否足以处理线程安全?注意,我的存储库使用的是UnitOfWork模式,其中包含我的nHibernate SessionFactory作为存储库的构造函数,而工作单元类是从我的IoC容器中提供的,由StructureMap使用下面的行实现,我在考虑这里使用的范围时是正确的会处理线程问题吗?

For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();
Run Code Online (Sandbox Code Playgroud)

问题的第二部分

我的数据模型(以及安全模型)的设置使得我的主要业务对象都被定义为一种大型层次结构模型,当我检查权限时,我会在该层次结构模型中查找用户帐户所在的位置默认情况下,定义并授予对其下所有内容的访问权限.辅助权限检查是使用管理定义的业务逻辑权限的权限,例如角色X中的用户可以访问"删除窗口小部件"功能.为此,我使用Route数据并提取Controller和Action名称,并将它们与当前用户的详细信息结合使用,以便访问我的数据库以解析此请求的权限.但是,对于页面上使用的每个ChildAction,也会重复这个逻辑,但是因为我使用了Route数据中的Controller和Action名称,所以我实际上并没有获得Child Action信息.它保留为父操作名称,而不是子操作,因为子操作未通过URL请求执行.这会导致对我的数据库进行冗余安全检查,以获取父操作和不必要的资源命中的详细信息.在研究这个时,我决定简单地绕过Child动作的安全性检查,并依赖于父动作.

bool bypassChildAction = filterContext.ActionDescriptor.IsDefined(typeof (ChildActionOnlyAttribute), true) || filterContext.IsChildAction;
if (bypassChildAction) return;
Run Code Online (Sandbox Code Playgroud)

这样做是否有意义,如果是这样,为什么?在我看来,如果Action使用ChildActionOnlyAttribute进行修饰,那么无论如何都无法通过URL公开访问它.如果它作为子操作执行但不仅仅是子操作,我可以绕过安全检查只是为了执行此操作,因为父操作将处理权限.您是否会遇到需要限制访问子操作的情况?知道子操作通常是非常小的部分视图我不认为这是一个问题,但我也看到OnAuthorization的默认实现中的一行引用了一些关于缓存的问题.有谁知道这是否会影响我提出的解决方案?

总结问题:

  • 在AuthorizeCore中从数据库访问用户权限的多线程问题
  • 安全问题绕过绕过子操作的授权检查
  • Child Actions的缓存问题与之前的观点相结合

任何有关这些方面的意见或帮助将不胜感激!

security asp.net-mvc caching thread-safety asp.net-mvc-3

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

修复了具有自动增量文件版本的汇编版本?

我正在尝试找到一种更有意义的方式来处理我的应用程序的版本控制,我来到了这篇知识库文章

http://support.microsoft.com/kb/556041

基本上它建议修复程序集版本,并为每个构建增加文件版本.现在这对我来说非常有意义,但对于我的生活,我似乎无法实现它.

下面的代码片段会自动增加Assembly版本和FileVersion.

[assembly: AssemblyVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)

虽然下一个似乎设置了固定的程序集版本1.0.0.0和固定的文件版本1.0.*.

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.*")]
Run Code Online (Sandbox Code Playgroud)

顺便提一下,文件属性的详细信息选项卡中的产品版本1.0.*现在也可以读取.现在我可以用这个修复文件属性中的产品版本......

[assembly: AssemblyInformationalVersion("1.0")]
Run Code Online (Sandbox Code Playgroud)

但这对我原来的任务没有帮助.出于好奇,我尝试了下面的文件版本改为2.0.*,所以它至少使用它.它不是自动递增.

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("2.0.*")]
Run Code Online (Sandbox Code Playgroud)

因此,根据我可以收集的唯一自动递增的版本号是程序集版本,但是如果没有指定文件版本,它将被设置为与程序集版本相同.

有没有人知道在保持程序集版本固定的同时自动增加文件版本的方法?

.net c# version

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

Orchard - 从主题布局中获取内容的标题

这将以这个速度让我发疯.从Orchard中的主题的Layout.cshtml文件内部,我如何确定主体内容的标题?

我尝试过使用Shape Tracer,但它似乎没有帮助.这些都没有给我任何文字.

@Html.Title()
@Model.Title                
@Model.Content.Parts_Common_Body.ContentItem.TitlePart
@Model.ContentItem.Parts_Common_Body.ContentItem.TitlePart
Run Code Online (Sandbox Code Playgroud)

更新: 这是HTML应该显示最终结果需要保持主题完整的内容,以及在我开始之前显示主题的图片.这个HTML只是我关注的部分片段.在图片中,搜索是ContentHeader区域中的内容.

<div id="wrapper-header-inner">
        <div id="header-inner">
        @Zone(Model.ContentHeader)
        <h1 class="pagetitle">
            Title Here
        </h1>
        </div><!-- #header-inner -->
</div><!-- #wrapper-header-inner -->
}


<div id="wrapper-content">
    <div id="content">
        @if(Model.Content != null) {
        <div class="main" class="@mainContentClass">
            @if(Model.Content != null && Model.LeftAside == null && Model.RightAside == null) {
                <div id="maincontentFull" class="positionleft">
                    @Zone(Model.Content)
                </div>
            }
            @* Other layout possabilities if left and/or right asides are present *@
        </div>
        }
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

生成的布局的快照

asp.net asp.net-mvc orchardcms

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

无法使用多个泛型类型获取接口/类的类型?

给出下面的示例代码,任何人都可以解释为什么第一次typeof()调用成功但第二次失败?无论它们是类还是接口都无论如何都无关紧要.

interface ITestOne<T1>
{
   T1 MyMethod();
}

interface ITestMany<T1, T2>
{
   T1 MyMethod(T2 myParameter);
}

void Main()
{
    var typeOne = typeof(ITestOne<>); //This line works
    var typeTwo = typeof(ITestMany<>); //Compile error
}
Run Code Online (Sandbox Code Playgroud)

c# generics compiler-errors typeof

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