Tag: asp.net web api

ASP.NET中的HostingEnvironment.QueueBackgroundWorkItem()用于小型后台任务

我来了一个很好的小工具,已经在v4.5.2中添加到了ASP.NET中 我正在徘徊它是多么安全以及如何在ASP.NET MVC或Web API场景中有效地利用它。 我知道我总是希望在我的Web应用程序中快速简单地执行任务并忘记任务。 例如: 发送电子邮件 发送推送通知 将分析或错误记录到数据库 现在通常我只创建一个名为的方法 public async Task SendEmailAsync(string to, string body) { //TODO: send email } 我会像这样使用它: public async Task Index() { … await SendEmailAsync(User.Identity.Username, “Hello”); return View(); } 现在我对此的担忧是,我推迟了用户以便向我们发送电子邮件。 这对我来说没什么意义。 所以我首先考虑做的是: Task.Run(()=> SendEmailAsync(User.Identity.Username, “Hello”)); 但是在阅读这篇文章的时候。 在IIS环境中显然不是最好的事情。 (我不是100%确定细节)。 所以这就是我遇到的HostingEnvironment.QueueBackgroundWorkItem(x=> SendEmailAsync(User.Identity.Username, “Hello”)); 这是一种非常快速简便的方法,可以将发送电子邮件任务卸载到后台工作程序,并更快地为用户View()提供服务。 现在我知道这不适用于运行时间超过90 seconds且不是100%保证执行的任务。 但我的问题是: HostingEnvironment.QueueBackgroundWorkItem()足以用于:在标准ASP.NET网站中发送电子邮件,推送通知,数据库查询等。

Ninject不解析OWIN的依赖关系

public class WebAppHost { public WebAppHost(IAppSettings appSettings) { this._appSettings = appSettings; } public Configuration(IAppBuilder appBuilder) { if(this._appSettings.StartApi) appBuilder.UseWebApi(); } } public class AppContext { public static void Start(string[] args) { DynamicModule.Utility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModule.Utility.RegisterModule(typeof(NinjectHttpModule)); _bootstrapper.Initialize(CreateKernel); WebApp.Start(“uri”); } private static IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.bind<Func>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.bind().To(); RegisterServices(kernel); return kernel; […]

ASP身份2 + Web API令牌身份validation – 持久声明未加载

我在ASP.NET Web API Token Auth中遇到了一些问题。 基本上我创建了一个具有一些声明的用户(值存储在AspNetUserClaim表中)但是当创建用户身份时,这些声明不会从数据库中提取。 我的设置细分如下。 用户类:具有GenerateUserIdentityAsync方法(非常标准)和一些自定义属性: public class LibraryUser : IdentityUser{ //Add Custom Properties Here public string Company { get; set; } public string DisplayName { get; set; } public async Task GenerateUserIdentityAsync(UserManager manager, string authenticationType) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, […]

使用HttpClient发布自定义类型

我有一个自定义的dto类: public class myObject { public string Id { get; set; } public string Name { get; set; } } 和一个使用Web Api的控制器(4.5 .net框架) [HttpPost] public IHttpActionResult StripArchiveMailboxPermissions(myObject param) { DoSomething(param); return OK(); } 客户端只有4.0 .net框架所以我将无法使用PostAsJsonAsync()方法。 将对象从我的客户端传递到服务器的解决方案是什么? 我试过像下面这样的东西: var response = Client.SendAsync(new HttpRequestMessage(objectTest)).Result; 但它抛出了我的exception: Could not load file or assembly ‘Microsoft.Json, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one […]

处理Odata / entityset / key / navigation

我们有一个基于ODataSamples-master odata示例的DynamicEdmModelCreation项目的项目。 我们设置了一个路由约定来处理对这个特定控制器的所有请求: [HttpGet] [EnableQuery] public EdmEntityObjectCollection Get() { … } [EnableQuery] public IEdmEntityObject Get(string key) { … } 我们试着举个例子 / odata /酒店 – >好的! / odata /酒店(1) – >好的! / odata /酒店(1)/房间 – >回复: 没有找到路由约定来为模板’〜/ entityset / key / navigation’选择OData路径的操作。 我们看到路由约定很好地处理请求并将其重定向到我们的控制器但没有执行任何方法。 路由公约是: public class MatchRoutingConventionService : IODataRoutingConvention { public string SelectAction( ODataPath odataPath, HttpControllerContext […]

同步操作场景中的ExceptionFilter堆栈跟踪

我在Controller中有一个简单的同步动作,它抛出一个exception,如下所示: [RoutePrefix(“”)] public class MyController : ApiController { [Route(“”)] public HttpResponseMessage Get() { throw new Exception(“whatever”); return Request.CreateResponse(HttpStatusCode.OK, “response”); } } 我还有一个ExceptionFilterAttribute来获取应用程序中发生的exception public class MyExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionContext) { var ex = actionContext.Exception; // Log ex, etc. } } 一切正常,因为我确实在MyExceptionFilterAttribute获得了exception。 问题是堆栈跟踪。 这是它的样子: at System.Web.Http.Filters.ActionFilterAttribute.d__1.MoveNext() — End of stack trace from […]

如何告诉属性使用自定义消息处理程序的基本身份validation?

我正在遵循Badri L.的Pro ASP .NET Web API安全性第8章,试图为将由HTTP / JS客户端使用的Web应用程序实现基本身份validation。 我已将以下身份validation处理程序添加到我的WebAPI项目中: public class AuthenticationHandler : DelegatingHandler { private const string SCHEME = “Basic”; protected async override Task SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { try { // Request Processing var headers = request.Headers; if (headers.Authorization != null && SCHEME.Equals(headers.Authorization.Scheme)) { Encoding encoding = Encoding.GetEncoding(“iso-8859-1”); // etc 当我使用[Authorize]在我的API中修饰方法并在上面的if语句中设置断点时, headers.Authorization在第一次请求时为null。 如果我继续这个中断,if语句再次被命中,这次使用headers.Authorization.Scheme作为“Negotiate”,而不是“Basic”: […]

我可以绕过MVC应用程序内的WebAPI控制器的组织身份validation吗?

我有一个MVC5,EF6应用程序,它使用组织身份validation(Azure AD),除了一件事,一切正常。 WebAPI控制器需要处理来自未经身份validation的客户端的请求。 客户端通常是发出AJAX请求的Android设备。 在我将组织身份validation添加到我的MVC应用程序之前,我的WebAPI控制器正在被调用并正常运行,所以我知道我的路由是正确的。 现在我添加了组织身份validation,不再调用我的WebAPI控制器,客户端的AJAX请求超时。 我知道有[Authorize]等属性可以指定对控制器/方法的访问权限,但在使用组织身份validation时,似乎没有调用没有[Authorize]属性的WebAPI控制器。 我的问题是,我可以标记我的WebAPI控制器以允许来自未经身份validation的客户端的请求,如果是这样,我该怎么办? 非常感谢。

使用C#从API下载PDF文件

好的,所以我正在创建一个控制台应用程序 连接到供应商API,以便在两个日期之间提取已提交费用的凭证号码 下载随费用提交的收据的PDF副本 第一部分,我工作得很好。 我能够连接到Vendor API并解析返回的XML以使用以下代码创建一个凭证编号数组(需要获取PDF图像): static async Task RunAsyncCR() { using (var client = new HttpClient()) { var values = new Dictionary { {“un”,”SomeUser”}, {“pw”,”SomePassword”}, {“method”,”getVoucherInvoices”}, {“fromDate”,”05/30/2016″}, {“toDate”, “06/13/2016”} }; var content = new FormUrlEncodedContent(values); Console.WriteLine(“Connecting…”); var response = await client.PostAsync(“https://www.chromeriver.com/receipts/doit”, content); Console.WriteLine(“Connected…”); var responseString = await response.Content.ReadAsStringAsync(); char[] DelimiterChars = {‘”) && s […]

使用存储库模式切换LazyLoading

默认情况下,在我的DbContext中禁用了LazyLoading。 我使用存储库模式,在某些情况下,我只需要获取简单的对象,而在其他情况下,我需要获取具有导航属性值的对象。 如何为LazyLoading实现类似开关的东西? 任何帮助将不胜感激 我有一个有效的解决方案,但我不确定它是否正确:在存储库的界面中我添加了新属性 public interface IRepository where T : BaseEntity { T GetById(object id); void Insert(T entity); ….. bool LazyLoadingSwitches { set; } } 然后实现它: public bool LazyLoadingSwitches { set { this.context.Configuration.LazyLoadingEnabled = value; } } 当我需要获取相关数据的模型时,我在控制器中使用: repository.LazyLoadingSwitches = true; name = order.Customer.FullName; repository.LazyLoadingSwitches = false; 请建议我最好的解决方案是什么?