小编Fra*_*ans的帖子

覆盖子类中的字段或属性

我有一个抽象基类,我想声明一个字段或属性,在每个继承自此父类的类中具有不同的值.

我想在基类中定义它,所以我可以在基类方法中引用它 - 例如重写ToString来说"这个对象是属性/字段类型".我有三种方法可以看到这样做,但我想知道 - 这样做的最佳或可接受的方式是什么?新手问题,抱歉.

选项1:
使用抽象属性并在继承的类上覆盖它.这得益于强制执行(你必须覆盖它)并且它是干净的.但是,返回硬代码值而不是封装字段感觉有点不对,而且它只是几行代码而不仅仅是.我还必须为"集合"声明一个主体,但这不太重要(并且可能有一种方法可以避免我不知道的情况).

abstract class Father
{
    abstract public int MyInt { get; set;}
}

class Son : Father
{
    public override int MyInt
    {
        get { return 1; }
        set { }
    }
}
Run Code Online (Sandbox Code Playgroud)

选项2
我可以声明一个公共字段(或受保护的字段),并在继承的类中显式覆盖它.下面的例子会给我一个使用"new"的警告,我可能会这样做,但它感觉不对,它打破了多态性,这是重点.看起来不是一个好主意......

abstract class Mother
{
    public int MyInt = 0;
}

class Daughter : Mother
{
    public int MyInt = 1;
}
Run Code Online (Sandbox Code Playgroud)

选项3
我可以使用受保护的字段并在构造函数中设置值.这看起来很整洁,但依赖于我确保构造函数始终设置这个并且使用多个重载构造函数总是有可能某些代码路径不会设置该值.

abstract class Aunt
{
    protected int MyInt;
}

class Niece : Aunt
{ …
Run Code Online (Sandbox Code Playgroud)

c# field properties

137
推荐指数
5
解决办法
15万
查看次数

我可以使用线程在IIS上执行长时间运行的作业吗?

在ASP.Net应用程序中,用户单击网页上的按钮,然后通过事件处理程序在服务器上实例化对象,并调用该对象上的方法.该方法转到外部系统来做东西,这可能需要一段时间.所以,我想要做的是在另一个线程中运行该方法调用,以便我可以通过"您的请求已经提交"将控制权返回给用户.我很乐意这样做,虽然用户可以继续轮询对象的状态,但它会更好.

我不知道的是,即使用户会话过期,IIS是否允许我的线程继续运行.想象一下,用户触发事件并在服务器上实例化对象并在新线程中触发该方法.用户对"您的请求已提交"消息感到满意并关闭其浏览器.最终,此用户会话将在IIS上超时,但该线程可能仍在运行,正在运行.IIS会允许线程继续运行还是会在用户会话到期后将其终止并处理掉对象?

编辑:从答案和评论,我知道这样做的最好方法是将长时间运行的处理移到IIS之外.除了其他一切,这涉及appdomain回收问题.在实践中,我需要在有限的时间内完成版本1并且必须在现有框架内工作,因此希望避免服务层,因此希望在IIS内部启动线程.实际上,这里的"长时间运行"只需几分钟,网站上的并发性很低,所以应该没问题.但是,下一个版本肯定需要拆分成一个单独的服务层.

asp.net iis multithreading background-process

81
推荐指数
6
解决办法
5万
查看次数

哪个是C#和.NET的"最佳"数据访问框架/方法?

(编辑:我把它变成了社区维基,因为它更适合协作格式.)

从.NET访问SQL Server和其他数据库有很多种方法.所有这些都有其优点和缺点,它永远不会是一个简单的问题,哪个是"最好的" - 答案永远是"它取决于".

但是,我正在寻找不同层次系统背景下不同方法和框架的高层次比较.例如,我认为对于快速而肮脏的Web 2.0应用程序,答案与内部企业级CRUD应用程序有很大不同.

我知道Stack Overflow上有很多关于这个问题子集的问题,但我认为尝试构建一个汇总比较会很有用.我会尽力更新问题并加以纠正和澄清.

到目前为止,这是我对高层的理解 - 但我确信这是错误的......我主要关注微软的方法来保持这一点.

ADO.NET实体框架

  • 数据库不可知
  • 很好,因为它允许交换后端
  • 糟糕,因为它可以达到性能,数据库供应商对它不太满意
  • 似乎是MS未来的首选路线
  • 复杂学习(但见267357)
  • 它通过LINQ to Entities访问,因此提供ORM,从而允许在代码中进行抽象

LINQ to SQL

"标准"ADO.NET

  • 没有ORM
  • 没有抽象,所以你回到"自己动手"并使用动态生成的SQL
  • 直接访问,可以提供更好的性能
  • 这与关于是否专注于对象或关系数据的古老争论有关,答案当然是"它取决于大部分工作的位置",因为这是一个无法回答的问题,希望我们不要不得不太过分了.恕我直言,如果你的应用程序主要是操作大量数据,将它过多地抽象到前端代码中的对象是没有意义的,你最好使用存储过程和动态SQL来完成尽可能多的工作.可能在后端.然而,如果您主要进行用户交互,导致数十或数百行的数据库交互,那么ORM就完全有意义了.所以,我想我对旧式ADO.NET的论证是在你操纵和修改大数据集的情况下,
  • 当然,另一种情况是您必须访问已由存储过程保护的旧数据库.

ASP.NET数据源控件

这些东西是完全不同的还是仅仅是标准ADO.NET的一层? - 如果您有DAL或者实施了LINQ或实体,您真的会使用这些吗?

NHibernate的

  • 似乎是一个非常强大和强大的ORM?
  • 开源

其他一些相关链接; NHibernate或LINQ to SQL Entity Framework与LINQ to SQL

.net c# sql asp.net

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

如何使用ASP.Net vNext/5登录到Output窗口

使用Visual Studio 2015 RC和ASP.Net vNext/5 beta4.我想在调试时将记录输出到Visual Studio中的输出窗口,或者如果可能的话,在使用WebListener时输出到托管站点的控制台窗口.我的Web项目是基于Web应用程序的标准开箱即用模板构建的,因此其中包含大多数默认内容.

在我,Startup我有通常的默认

loggerfactory.AddConsole();  
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我注入ILoggerFactory并执行类似的操作;

this.logger = loggerFactory.CreateLogger<ThingClass>();
this.logger.LogVerbose("Verbose");
this.logger.LogInformation("Info");
this.logger.LogError("error");
Run Code Online (Sandbox Code Playgroud)

这些都没有写到调试窗口或其他地方 - 我不确定AddConsole()应该在这里实现什么?

然后我尝试添加Microsoft.Framework.Logging.TraceSourceproject.json

loggerfactory.AddTraceSource(new SourceSwitch("web-app", "Verbose"), new DefaultTraceListener());
Run Code Online (Sandbox Code Playgroud)

Startup.这实际上有效 - 除了现在每个日志消息都被写入控制台两次,这是相当烦人的.

我显然遗漏了一些基本的东西,但找不到关于新的Microsoft.Framework.Logging的任何文档.事实上,我能够追踪到的最全面和最深入的文档是Nicholas Blumhardt的简短文章:http://nblumhardt.com/2015/05/diagnostic-logging-in-dnx-asp-net-5 /.

确实理解框架应该只是一个包装器,我可以实现我自己的提供程序以及使用一系列框架,如Serilog等.但是...对于一个简单的应用程序肯定我应该能够登录到调试在没有很多仪式的VS窗口?

c# logging visual-studio-2015 asp.net-core

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

如何使用.Net构建安全的Web服务?

我需要构建一个简单的Web服务,通​​过Internet将数据输入和输出HR系统(这是一个托管解决方案).我正在使用IIS和ASP.Net与.Net 2.0.

看了之后,有几种方法可以确保网络服务的安全 - 我正在考虑选择哪种方法,并对一些优缺点进行一些观察.

这些是我所知道的方法:

SoapHeaders over SSL

将UID/PWD发布到Soap头中并实现SOAP扩展(链接).
非常简单的实现,并且应该通过SSL非常安全.由于相对简单,这是我的首选方案.此外,由于历史原因,我需要使用VBScript中的所有Web服务,因此只需处理简单的SOAP即可. 但是,有什么警告吗?我是否会让客户抱怨这是一种安全隐患?

将WCF与TransportWithMessageCredential一起使用

我发现很多旧文章指的是WS,如果我没有被误解,这就是现在在WCF中提供的内容?这个Microsoft链接有一个入门.
如果我理解正确,它会在客户端和服务器之间使用基于证书的安全性进行身份验证.这是正确的还是我完全错了?
我怀疑这将是一项更大的工作,至少在实施方面是明智的.此外,我将无法直接从VBScript访问Webservice,因此必须编写一个调用它的DLL然后在本地部署 - 正确吗?
这甚至可以在.Net 2.0中使用吗?

其他方法

  • 我可以禁止匿名访问asmx文件,并使用依赖IIS通过质询/响应进行身份验证.这在我的场景中实际上是实用的,但感觉非常不优雅(并且不知道如何从VBScript中完成这项工作).
  • 将UID传递给方法调用是SoapHeader的一个不好的表兄,所以我不会使用它.

对于解决这个问题的最佳方法,我将非常感激.如果有人有一个很好的论据,为什么Soap Headers是安全的,那么我很乐意听到它,因为这似乎是最简单的使用,只要它"足够安全".

.net security vbscript ws-security web-services

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

从Validate函数返回额外信息的最佳实践

我有一个班级员工.我希望能够在保存之前验证它()以确保所有字段都填充了有效值.类的用户可以在调用Save()之前调用Validate(),或者他们可以直接调用Save(),然后Save()将调用Validate(),如果验证失败,可能会抛出异常.

现在,我的(主要)问题是这个;
如果我的Validate()函数返回一个简单的bool,那么如何告诉用户该类的错误,即"未填写电子邮件","ID不唯一"等.出于此目的,我只想要错误字符串传递给人类用户,但如果我想要一个错误代码列表(除了使位图的使用更符合逻辑),原则是相同的.

  • 我可以在Validate函数中使用Out参数,但我知道这是不赞成的.
  • 我可以从我的函数返回一个字符串数组,而不是返回一个bool,只测试它是否为空(意味着没有错误) - 但这看起来很麻烦而且不对.
  • 我可以创建一个Struct只是为了从这个方法返回,包括一个bool和一个带有错误消息的字符串数组,但只是看起来很笨拙.
  • 我可以返回错误代码的位图而不是bool并查找它,但这似乎相当过分.
  • 我可以在对象上创建一个公共属性"ValidationErrors"来保存错误.但是,这将依赖于我在读取它之前调用Validate()或从Property()显式调用Validate,这有点浪费.

我的具体程序是在C#中,但这看起来像是一个相当通用的"最佳实践"问题,我相信我应该知道答案.任何建议都感激不尽.

c#

8
推荐指数
2
解决办法
1788
查看次数

在Azure上的Localhost上使用WCF

总结
如何在Azure上的IIS中托管时如何在localhost上访问WCF服务?Azure不会将localhost或127.0.0.1绑定到我的网站.

详细信息
我在Azure上托管了一个ASP.Net应用程序.我添加了一个.svc和一些我想通过WCF使用的工作流程.为了简单起见,我的网络应用程序只是在localhost上调用服务,所以我在web.config中有这样的端点;

<client>
  <endpoint address="http://localhost:8080/Router.svc/Case" binding="basicHttpBinding" contract="NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow" name="Case" />
  <endpoint address="http://localhost:8080/Workflow/Case/Case_default1.xamlx" binding="basicHttpBinding" contract="*" name="Case_default1" />
</client>
Run Code Online (Sandbox Code Playgroud)

这在我的本地机器上工作得很好.问题是,当我将此发布到Azure时,IIS中的网站不会绑定到localhost,而是绑定始终是服务器的实际IP地址.它最终在applicationHost.config中看起来像这样:

<bindings>
   <binding protocol="http" bindingInformation="10.61.90.44:80:" />
   <binding protocol="https" bindingInformation="10.61.90.44:443:" />
   <binding protocol="http" bindingInformation="10.61.90.44:8081:" />
</bindings>
Run Code Online (Sandbox Code Playgroud)

因此,只要我的Web应用程序尝试在localhost(或127.0.0.1)上调用该服务,它就会立即失败.不用说,如果我转到服务器并更改绑定,那么一切都很好.

我发现很奇怪的是,有很多例子,人们在Azure上的localhost上访问WCF服务,所以我无法弄清楚为什么会这样.我已经将osFamily设置为2并且为了调试这个我启用了Web发布和远程桌面访问,我认为理论上可能会搞砸了.

我已经看过了什么

  • 我可以在运行时重写代码中的端点地址,用localhost代替实际地址,或者如Ron在答案中所描述的那样动态创建端点.不幸的是我正在使用WCF路由服务,因此我可以对工作流进行版本控制.这意味着我的代码调用路由器端点,而WCF路由器依次使用web.config中指定的端点调用实际的服务/工作流.我没有控制路由服务端点解析,我认为,编写一整套路由逻辑,当我想要的只是调用localhost时,这似乎是很多工作.
  • 切换到使用命名管道; 唉,它会导致工作流程出现一些奇怪的问题,可能是由于双工,而且我处于截止日期,所以没有时间在那一刻到达底层.

wcf azure workflow-foundation-4

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

使用Web API和Ninject注入IOwinContext

使用Ninject的Web API 2和OWIN托管.

我想将当前的IOwinContext注入某些服务(因此我可以获取请求以使主体进行一些数据过滤).

使用Web Hosting,在过去,我会使用HttpContext.Current,但这不是OWIN托管的选项(并且很好的解决).

这个SO问题解释了如何使用Autofac.本质上,您创建一个依赖关系范围,然后在每个请求上调用Autofac的Registerinstance将当前IOwinContext注册到该依赖范围中,如下所示:

app.Use(async (ctx, next) =>
{
    // this creates a per-request, disposable scope
    using (var scope = container.BeginLifetimeScope(b =>
    {
        // this makes owin context resolvable in the scope
        b.RegisterInstance(ctx).As<IOwinContext>();
    }))
    {
        // this makes scope available for downstream frameworks
        ctx.Set<ILifetimeScope>("idsrv:AutofacScope", scope);
        await next();
    }
}); 
Run Code Online (Sandbox Code Playgroud)

那很优雅.使用Ninject和Ninject.Web.WebApi.OwinHosting我已经为每个请求获取了一个命名范围,以便管理.但是,我无法在ninject中找到任何方法来镜像AutoFac的RegisterInstance方法:这里的关键是此绑定仅在此特定依赖范围内有效.

我已经阅读了有关Scope的各种选项,但我发现的所有内容都依赖于能够声明常量或ToMethod.我在这里要做的是说,"好吧,我现在有一个ninject依赖范围,如果有人从这个范围请求IOwinContext ,给他们这个我已经拥有的实例.

注意

我确实理解我可以从我的控制器中获取当前上下文并传递它,但这反而违背了我想要做的目的; 我希望我的DbContext能够理解用户是谁,以便过滤数据.当然,一旦我可以获得IOwinContext,我实际上不会将它传递给DbContext,而是我将使用ToMethod或类似的方法来提取ClaimsPrincipal,但这超出了这个问题的范围.

ninject asp.net-web-api owin

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

如何从asp.net中的客户端网络摄像头捕获图像

我正在开发ASP.Net应用程序,我希望用户能够使用本地网络摄像头拍照,然后将其上传到服务器.当然,我可以依靠用户通过本地安装的软件手动执行此操作,将图像保存为文件并执行正常的文件上传.但是,我真正想要做的是将它全部合并到浏览器的UI中.我知道这意味着访问本地资源所以我需要一个ActiveX控件或Silverlight,或者我可以在Javascript中做些什么?

这最初是用于Intranet应用程序,所以我可以控制客户端的environemnt,包括规定浏览器等,这意味着我可以使用ActiveX控件,如果必须的话.但是,如果我能以通用方式编写它,那将是很好的,因此它可以在一般的互联网应用程序中使用(很高兴规定它只适用于Windows客户端,但最好能让它在FireFox中工作).

谢谢.

asp.net webcam

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

初学者在C#中进行线程化

你能推荐一系列好的文章,或者最好是一本关于如何开始使用线程的书籍,尤其是C#?我主要是在控制台应用程序和ASP.Net应用程序中寻找线程的使用.

我只了解线程的基础知识,并且知道"这里是龙",所以在我开始使用它们之前想要得到一个良好的基础.

我很好奇的事情就像是有一个线程池的概念,你如何管理它的大小,你如何选择排队的东西直到一个线程可用而强迫一个新线程开始等等.另外,我明白了IIS有很多内置的线程处理,所以解释如何使用IIS下的ASP.Net中的线程以及它与控制台C#应用程序中的线程的区别是很有趣的.

我的用途包括:

  • 用户在ASP.Net页面上做了一些事情,导致我的服务器端代码需要连接到另一个系统并执行冗长的操作,所以我想通过将该操作发送到另一个线程来快速将控制权返回给用户.用户可以通过AJAX继续观察进度,或者只是离开 - 毕竟网络是无状态的:)

  • 使用Fire和忘记模式(那里有大量示例代码,我想更多地了解它们是如何工作的)

谢谢

c# asp.net iis multithreading

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

IdP使用ThinkTecture IdentityServer v3启动登录

摘要

在SAML中,存在IdP启动登录的概念,这意味着识别方(IdP)可以向依赖方(RP /消费应用程序)发送未经请求的令牌,并且用户可以登录而无需呼叫IdP .我有一个场景,我需要这样做,但我希望ThinkTecture Identity Server v3处于中间位置,因为我将在那里处理我的正常身份验证(如在非SAML日常工作中).由于我无法控制的原因,我无法打电话给SAML IdP.我想做的是:

IdP通过Identity Server启动SSO

我花了很多时间看这个,我也查看了从第三方开始登录的规范,但如果我理解正确,它仍然从第三方开始指导用户到RP然后,它向IdP(可能是ThinkTecture身份服务器)发送登录请求,这不是我真正需要的.

总之,我认为OpenID Connect不具备SAML的IdP发起的SSO.这是正确的还是我无法弄明白,或者ThinkTecture IdentityServer不支持它?

更多细节

  • 我已成功使用KentorIT的AuthServices OWIN中间件将IdP启动的SAML SSO直接实现到网站中,而不是完全使用IdSrv.
  • 我还将Kentor的OWIN中间件与IdSrv集成,以便我的网站重定向到IdSrv,然后重定向到我登录的SAML服务器,返回IdSrv,然后转换SAML令牌并将OpenID身份令牌发送回我的网站.
  • 为了好玩,我还使用了Kentor的库来获得一个解压缩SAML令牌的MVC控制器,所以如果我想要我可以用它做一些手动认证.

这一切都很有效,非常感谢ThinkTecture和KentorIT.唉,这一切仍然从我的网站开始,最终导致重定向到SAML服务器,由于非技术原因,我无法在我的方案中做到这一点.

替代方案

在这种情况下,我当然可以完全免除IdSrv,但我有理由让IdSrv处于中间位置,并通过我的所有身份验证.所以我现在的想法是做这个流程:

  1. SAML服务器将SAML令牌发送到我网站上的特定URL.
  2. 我的网站将按原样将该令牌重新发布到Identity Server.Identity Server已经安装了KentorIT OWIN中间件,因此只需将用户登录到IdSrv,这意味着IdSrv会设置一个auth cookie.
  3. IdSrv执行简单的重定向回到我网站上的另一个URL,并且不包含任何令牌.到目前为止,这与IdSrv无关.
  4. 我的网站现在向IdSrv发出身份验证请求
  5. 由于用户已登录到IdSrv,因此IdSrv将立即响应并使用身份令牌将用户重定向回我的网站 替代方案 这是很多重定向,但它应该工作.

在我开始实施它之前,有人能告诉我这是否是正确的方法,或者我错过了一些非常明显的东西?

编辑1

看起来这个想法也不起作用.基本上我需要做的是使用IdP启动的SAML SSO向Identity Server进行身份验证,然后重定向到RP并使用身份验证请求将RP重定向到Identity Server.但是,据我所知,除非作为RP请求的一部分,否则无法让Identity Server登录.换句话说,即使我的SAML中间件很乐意接受未经请求的令牌,IdSrv也会忽略SAML中间件请求将其登录(我认为这是公平的).

因此,我认为另一种解决方案是编写一个控制器,该控制器可以验证SAML令牌并直接在同一服务器上运行的代码中调用IdSrv ,并告诉它使用我手动构造的主体来记录用户.

(新)问题是,Identity Server是否公开了一种机制,让我在代码中记录用户,以便Identity Server为用户设置适当的cookie

saml-2.0 thinktecture-ident-server kentor-authservices openid-connect

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

EF 4.1,继承和共享主键关联=>指定表达式的ResultType不兼容

摘要

我有三个班:

  • Account
  • SpecialAccount(继承自Account)
  • Profile(0..1关系SpecialAccount)

换句话说,a SpecialAccount可以有0或1 Profiles.一个Profile必须有SpecialAccount.

在EF中,这只能设置为共享主键关系.

当查询profile和询问来自SpecialAccount(例如,"查找配置文件在哪里profile.SpecialAccount.Name == "blah")的东西时,我收到此错误:

{"指定表达式的ResultType与所需类型不兼容.
表达式ResultType为'Transient.reference [EFInheritanceTest.Account]',但
所需类型为'Transient.reference [EFInheritanceTest.SpecialAccount]'.
\r \nParameter名称:参数1 "}

细节

此代码说明了问题:

namespace EFInheritanceTest
{
  class Program
  {
      static void Main(string[] args)
      {
         using (var context = new MyContext())
         {
            var t = context.Profiles.Where(p => p.SpecialAccount.Name == "Fred");
            Console.WriteLine(t.Count());

            Console.ReadKey();
         }
      }
  }

  public class MyContext : DbContext
  {
     public DbSet<Account> …
Run Code Online (Sandbox Code Playgroud)

entity-framework ef-code-first entity-framework-4.1

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

从Constructor调用工厂以获取"this"的新版本

我可能会向后看这个...我有一个类似于文档的类和另一个类似模板的类.它们都从相同的基类继承而且我有一个方法来从模板(或从另一个文档,它在基类中的方法)创建一个新文档.所以,如果我想从模板创建一个新文档,我只是实例化模板并在其上调用GetNewDoc();

Document doc = mytemplate.GetNewDoc();
Run Code Online (Sandbox Code Playgroud)

在Document类中,我有一个空白构造函数创建一个新的空白文档以及另一个带有文档ID的构造函数,以便我可以从数据库加载文档.但是,我还想要一个带有模板ID的构造函数.这样我就能做到

Document doc = New Document(TemplateID)
Run Code Online (Sandbox Code Playgroud)

因为模板类已经具有返回文档的能力,所以我希望构造函数能够做类似的事情

Template temp = new Template(TemplateID);
this = temp.GetNewDoc();
Run Code Online (Sandbox Code Playgroud)

当然,我不能这样做,因为"这个"是只读的 - 无论如何它感觉很奇怪.我有一种感觉,我在这里非常愚蠢,所以随意喊:)

问题是所讨论的对象非常复杂,有多个子对象集合和多个表上的数据库持久性,因此我不想复制太多代码.虽然,我想我可以从模板中获取新文档然后复制字段/属性,因为集合应该足够容易 - 这看起来像重复.

一个更精细的代码示例:

using System;
using System.Collections.Generic;
using System.Text;

namespace Test
{
class Program
{
    static void Main(string[] args)
    {
        // This just creates the object and assigns a value
        Instance inst = new Instance();
        inst.name = "Manually created";
        Console.WriteLine("Direct: {0}", inst.name);

        //This creates a new instance directly from a template
        MyTemplate def = new MyTemplate(); …
Run Code Online (Sandbox Code Playgroud)

c# constructor

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