我有一个抽象基类,我想声明一个字段或属性,在每个继承自此父类的类中具有不同的值.
我想在基类中定义它,所以我可以在基类方法中引用它 - 例如重写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) 在ASP.Net应用程序中,用户单击网页上的按钮,然后通过事件处理程序在服务器上实例化对象,并调用该对象上的方法.该方法转到外部系统来做东西,这可能需要一段时间.所以,我想要做的是在另一个线程中运行该方法调用,以便我可以通过"您的请求已经提交"将控制权返回给用户.我很乐意这样做,虽然用户可以继续轮询对象的状态,但它会更好.
我不知道的是,即使用户会话过期,IIS是否允许我的线程继续运行.想象一下,用户触发事件并在服务器上实例化对象并在新线程中触发该方法.用户对"您的请求已提交"消息感到满意并关闭其浏览器.最终,此用户会话将在IIS上超时,但该线程可能仍在运行,正在运行.IIS会允许线程继续运行还是会在用户会话到期后将其终止并处理掉对象?
编辑:从答案和评论,我知道这样做的最好方法是将长时间运行的处理移到IIS之外.除了其他一切,这涉及appdomain回收问题.在实践中,我需要在有限的时间内完成版本1并且必须在现有框架内工作,因此希望避免服务层,因此希望在IIS内部启动线程.实际上,这里的"长时间运行"只需几分钟,网站上的并发性很低,所以应该没问题.但是,下一个版本肯定需要拆分成一个单独的服务层.
(编辑:我把它变成了社区维基,因为它更适合协作格式.)
从.NET访问SQL Server和其他数据库有很多种方法.所有这些都有其优点和缺点,它永远不会是一个简单的问题,哪个是"最好的" - 答案永远是"它取决于".
但是,我正在寻找不同层次系统背景下不同方法和框架的高层次比较.例如,我认为对于快速而肮脏的Web 2.0应用程序,答案与内部企业级CRUD应用程序有很大不同.
我知道Stack Overflow上有很多关于这个问题子集的问题,但我认为尝试构建一个汇总比较会很有用.我会尽力更新问题并加以纠正和澄清.
到目前为止,这是我对高层的理解 - 但我确信这是错误的......我主要关注微软的方法来保持这一点.
这些东西是完全不同的还是仅仅是标准ADO.NET的一层? - 如果您有DAL或者实施了LINQ或实体,您真的会使用这些吗?
其他一些相关链接; NHibernate或LINQ to SQL Entity Framework与LINQ to SQL
使用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.TraceSource
到project.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窗口?
我需要构建一个简单的Web服务,通过Internet将数据输入和输出HR系统(这是一个托管解决方案).我正在使用IIS和ASP.Net与.Net 2.0.
看了之后,有几种方法可以确保网络服务的安全 - 我正在考虑选择哪种方法,并对一些优缺点进行一些观察.
这些是我所知道的方法:
将UID/PWD发布到Soap头中并实现SOAP扩展(链接).
非常简单的实现,并且应该通过SSL非常安全.由于相对简单,这是我的首选方案.此外,由于历史原因,我需要使用VBScript中的所有Web服务,因此只需处理简单的SOAP即可.
但是,有什么警告吗?我是否会让客户抱怨这是一种安全隐患?
我发现很多旧文章指的是WS,如果我没有被误解,这就是现在在WCF中提供的内容?这个Microsoft链接有一个入门.
如果我理解正确,它会在客户端和服务器之间使用基于证书的安全性进行身份验证.这是正确的还是我完全错了?
我怀疑这将是一项更大的工作,至少在实施方面是明智的.此外,我将无法直接从VBScript访问Webservice,因此必须编写一个调用它的DLL然后在本地部署 - 正确吗?
这甚至可以在.Net 2.0中使用吗?
对于解决这个问题的最佳方法,我将非常感激.如果有人有一个很好的论据,为什么Soap Headers是安全的,那么我很乐意听到它,因为这似乎是最简单的使用,只要它"足够安全".
我有一个班级员工.我希望能够在保存之前验证它()以确保所有字段都填充了有效值.类的用户可以在调用Save()之前调用Validate(),或者他们可以直接调用Save(),然后Save()将调用Validate(),如果验证失败,可能会抛出异常.
现在,我的(主要)问题是这个;
如果我的Validate()函数返回一个简单的bool,那么如何告诉用户该类的错误,即"未填写电子邮件","ID不唯一"等.出于此目的,我只想要错误字符串传递给人类用户,但如果我想要一个错误代码列表(除了使位图的使用更符合逻辑),原则是相同的.
我的具体程序是在C#中,但这看起来像是一个相当通用的"最佳实践"问题,我相信我应该知道答案.任何建议都感激不尽.
总结
如何在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发布和远程桌面访问,我认为理论上可能会搞砸了.
我已经看过了什么
使用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,但这超出了这个问题的范围.
我正在开发ASP.Net应用程序,我希望用户能够使用本地网络摄像头拍照,然后将其上传到服务器.当然,我可以依靠用户通过本地安装的软件手动执行此操作,将图像保存为文件并执行正常的文件上传.但是,我真正想要做的是将它全部合并到浏览器的UI中.我知道这意味着访问本地资源所以我需要一个ActiveX控件或Silverlight,或者我可以在Javascript中做些什么?
这最初是用于Intranet应用程序,所以我可以控制客户端的environemnt,包括规定浏览器等,这意味着我可以使用ActiveX控件,如果必须的话.但是,如果我能以通用方式编写它,那将是很好的,因此它可以在一般的互联网应用程序中使用(很高兴规定它只适用于Windows客户端,但最好能让它在FireFox中工作).
谢谢.
你能推荐一系列好的文章,或者最好是一本关于如何开始使用线程的书籍,尤其是C#?我主要是在控制台应用程序和ASP.Net应用程序中寻找线程的使用.
我只了解线程的基础知识,并且知道"这里是龙",所以在我开始使用它们之前想要得到一个良好的基础.
我很好奇的事情就像是有一个线程池的概念,你如何管理它的大小,你如何选择排队的东西直到一个线程可用而强迫一个新线程开始等等.另外,我明白了IIS有很多内置的线程处理,所以解释如何使用IIS下的ASP.Net中的线程以及它与控制台C#应用程序中的线程的区别是很有趣的.
我的用途包括:
用户在ASP.Net页面上做了一些事情,导致我的服务器端代码需要连接到另一个系统并执行冗长的操作,所以我想通过将该操作发送到另一个线程来快速将控制权返回给用户.用户可以通过AJAX继续观察进度,或者只是离开 - 毕竟网络是无状态的:)
使用Fire和忘记模式(那里有大量示例代码,我想更多地了解它们是如何工作的)
谢谢
在SAML中,存在IdP启动登录的概念,这意味着识别方(IdP)可以向依赖方(RP /消费应用程序)发送未经请求的令牌,并且用户可以登录而无需呼叫IdP .我有一个场景,我需要这样做,但我希望ThinkTecture Identity Server v3处于中间位置,因为我将在那里处理我的正常身份验证(如在非SAML日常工作中).由于我无法控制的原因,我无法打电话给SAML IdP.我想做的是:
我花了很多时间看这个,我也查看了从第三方开始登录的规范,但如果我理解正确,它仍然从第三方开始指导用户到RP然后,它向IdP(可能是ThinkTecture身份服务器)发送登录请求,这不是我真正需要的.
总之,我认为OpenID Connect不具备SAML的IdP发起的SSO.这是正确的还是我无法弄明白,或者ThinkTecture IdentityServer不支持它?
这一切都很有效,非常感谢ThinkTecture和KentorIT.唉,这一切仍然从我的网站开始,最终导致重定向到SAML服务器,由于非技术原因,我无法在我的方案中做到这一点.
在这种情况下,我当然可以完全免除IdSrv,但我有理由让IdSrv处于中间位置,并通过我的所有身份验证.所以我现在的想法是做这个流程:
在我开始实施它之前,有人能告诉我这是否是正确的方法,或者我错过了一些非常明显的东西?
看起来这个想法也不起作用.基本上我需要做的是使用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
摘要
我有三个班:
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) 我可能会向后看这个...我有一个类似于文档的类和另一个类似模板的类.它们都从相同的基类继承而且我有一个方法来从模板(或从另一个文档,它在基类中的方法)创建一个新文档.所以,如果我想从模板创建一个新文档,我只是实例化模板并在其上调用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# ×6
asp.net ×4
.net ×2
iis ×2
asp.net-core ×1
azure ×1
constructor ×1
field ×1
logging ×1
ninject ×1
owin ×1
properties ×1
saml-2.0 ×1
security ×1
sql ×1
vbscript ×1
wcf ×1
web-services ×1
webcam ×1
ws-security ×1