标签: asp.net-web-api

将 Angular (6) 客户端错误发送到 Web API 进行记录

另一个人在这里问了我确切的问题,但没有答案:Angular 2 Client Side Errors

我想要一种方法(如果可能的话,避免使用额外的第三方框架)将我的客户端 Angular 错误发送到我的后端异常记录器。

我的后端只是一个.NET Web API连接到我们SQL Server数据库的项目。当前,每当发生服务器错误时,我的服务器端错误都会通过调用存储过程控制器记录到数据库中(我使用 KudVenKat 的教程来构建此错误:http ://csharp-video-tutorials.blogspot.com/2012/12/logging -database-part-75.html 的异常)。

有没有办法编写一个 Angular 服务来调用我的 ErrorLogger API 将我的 Angular 错误记录到数据库中?

我想我可能需要调整我的后端记录器控制器,因为它使用 .NET 的System.Exception类,我猜它只适合检测服务器端异常,而不是 Angular 的异常。我可能需要一个完全不同的记录器控制器和数据库表来仅处理客户端错误 - 但如果可能的话,我希望将服务器和客户端错误记录到同一个表中。

知道这一点-我正在尝试做的事情甚至是一个好的方法吗?如果没有,任何人都可以给我一个关于如何记录这些客户端错误的高级描述吗?

asp.net logging exception asp.net-web-api angular

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

Angular HTTP POST 未触发

我在从 NG 应用程序向 ASP.NET Core WebAPI 进行简单调用时遇到问题。代码如下:

  this.http.post(actionUrl, credentialsDto)
  .map((data: Response) => {
    if (data !== null) {
      localStorage.setItem(this.tokenStorageKey, JSON.stringify(data));
    }
});
Run Code Online (Sandbox Code Playgroud)

我尝试记录我的“data”回调参数,但在 if 语句中添加对 console.log() 的调用不会产生任何结果(意味着我根本没有控制台输出)。同时,如果我在调用之前或之后添加 console.log() 调用,但在同一函数中,它们会完美执行。

有谁知道这里发生了什么事?我是一个JS新手,所以不要怪我。我正在使用 Angular 5 中的原生 HTTP 客户端。

提前致谢。

post http asp.net-web-api angular

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

带有 .net Core 的 Angular Cookie

我有一个 asp.net core web api 和 Angular 前端。应用程序向 Web API 上的控制器操作发送帖子并对用户进行身份验证。

我的问题是返回身份验证 cookie 并最终存储的正确方法是什么?我发现这个cookie 库似乎可以很好地满足我的目的。一些更具体的问题是:

  • cookie 应该有什么名称?GUID 可以吗?我听说过加密,或者只是会话 ID。cookie 将仅通过 HTTPS 发送
  • 我如何在 asp.net core 中创建 cookie?我获得用户名密码并简单地使用 SQL 服务器验证结果,但我不希望用户每次都登录
  • 如何从 http post 请求中检索 cookie?我正在使用 httpClient 发布到 url。我知道如何使用带有角度的http拦截器将其发回。

感谢您花时间阅读这篇长文章。

.net cookies asp.net-web-api angular

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

通过 .Net Web api 从 azure blob 下载文档

我很难弄清楚出了什么问题。我的应用程序访问 api 来获取文档。发生的情况是下载开始,但挂起。最终它会完成(要么有错误,要么完全完成),但是当我尝试打开 pdf 时,我收到“无法打开 pdf”或类似的信息。它在本地工作。

我的控制器:

 [Route("api/listing/attachment")]
    [HttpGet]
    public async Task<IHttpActionResult> GetAttachmentAsync(string fileName)
    {
        var attachment = await _repository.GetAttachmentAsync(fileName);
        var response = HttpContext.Current.Response;
        response.Clear();
        response.ContentType = "application/x-download";
        var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
        response.AddHeader("content-disposition", string.Format("attachment; filename={0}", removePath));
        response.AddHeader("content-length", attachment.Length.ToString());
        response.BinaryWrite(attachment);
        response.Flush();
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

我的存储库:

public async Task<byte[]> GetAttachmentAsync(string fileName)
    {
        var container = _blobClient.GetContainerReference(_containerName);
        var blockBlob = container.GetBlockBlobReference(fileName);
        using (var memoryStream = new MemoryStream())
        {
            await blockBlob.DownloadToStreamAsync(memoryStream);
            return memoryStream.ToArray();
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# asynchronous asp.net-web-api azure-blob-storage

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

Asp.net .core Web api 版本控制不适用于 Url 路径段

我事先在各种来源中搜索了我的问题,但答案并没有为我提供解决方案。

我使用此处介绍的方式在 .net core 2.2 项目中实现了基于 Url 的 Web api 版本控制。我用于版本控制的版本是最新的 Microsoft.AspNetCore.Mvc.Versioning 3.1.2。我还尝试从以下来源了解它是如何工作的:source1source2source3source4

我在名为 Initial 的文件夹中有一个带有 GET 方法的 ValueController,在名为 New 的文件夹中有一个 Value2Controller。这两个文件夹都是“Controllers”文件夹的子文件夹。

结构如下:

ValueController中的路由是 [Route("api/v{version:apiVersion}/[controller]")]

在 Value2Controller 中是: [Route("api/v{version:apiVersion}/value")]

我还在options.EnableEndpointRouting = false;Startup.cs 中进行了设置,并尝试调用 api/v1/value 或 api/v2/value。两次我都收到错误:多个操作匹配。它无法区分两个控制器的操作。

我尝试services.AddApiVersioning();完全不使用任何选项并删除 AddVersionedApiExplorer。这是行不通的。唯一有效的方法是放入 [Route("api/v{version:apiVersion}/[controller]")] 两个控制器并进行以下 api 调用:

api/v1/valueapi/v2/value2

我的startup.cs中的配置如下:

services.AddApiVersioning(options =>
    {
        options.ReportApiVersions = true;
        options.AssumeDefaultVersionWhenUnspecified = true;
        options.DefaultApiVersion = new ApiVersion(1, 0);
        options.ApiVersionReader = new UrlSegmentApiVersionReader();
        options.UseApiBehavior = …
Run Code Online (Sandbox Code Playgroud)

versioning asp.net asp.net-web-api asp.net-core

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

webapi控制器返回csv数据

我有一个 webapi 控制器代码如下:

\n\n
        [HttpPost]\n    public HttpResponseMessage DownloadForms(FormCriteria criteria)\n    {\n        string downloadData = new FormsToCsvHelper(Umbraco, criteria).GetCsv();\n        return Request.CreateResponse(HttpStatusCode.OK, downloadData);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我在发送回调试器之前查看调试器中返回的数据,它看起来像:

\n\n
Created Date,IP,Form Name,Email address,Message,Full Name\n
Run Code Online (Sandbox Code Playgroud)\n\n

31/05/2019 10:43:08,127.0.0.1,联系表 - 测试,test12@hotmail.com,测试,Ismail Mayat

\n\n

如果我将其复制并粘贴到文件中并另存为 csv,它在 Excel 中看起来很好。

\n\n

然而我实际得到的数据看起来像:

\n\n
"\xef\xbb\xbfCreated Date,IP,Form Name,Email address,Message,Full Name\\r\\n31/05/2019 10:43:08,127.0.0.1,Contact form - test,test12@hotmail.com,test,Ismail Mayat"\n
Run Code Online (Sandbox Code Playgroud)\n\n

整个记录集用引号括起来,换行符被视为文字,因此在 Excel 中打开文件时,所有记录都在一行中。

\n\n

有一个 DelegatingHandler 会触发,但那是针对特定的 url 请求,因此对于该请求它不会执行任何操作。

\n\n

有人知道发生了什么事吗?

\n

asp.net-web-api

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

如何将 ASP.NET MVC 核心视图和 ASP.NET WEB API 控制器分离到单独的项目中?

现在 API 和 MVC 控制器位于同一个项目中,这很好。稍后我将添加一个 Angular 前端。但由于 Angular 前端是一个单独的项目,因此 ASP.NET Core MVC 视图成为一个单独的项目是否有意义?任何地方都有链接如何做到这一点?我想这样 2 个视图(Angular 和 ASP.NET core MVC)都会调用 WEB API 层,这看起来更合乎逻辑。..

或者,如果他们留在同一个项目中,我至少应该让 MVC 控制器调用 WEB API 控制器?或没有 ?

c# asp.net-mvc asp.net-web-api

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

当后缀为“Z”时,ASP.NET Core API ISO8601 未在本地时间解析

场景:我有一个接受 POST 请求的 REST-API。作为正文数据,传递了 ISO8601 格式的日期时间。

{
    "validate": "2019-12-02T23:00:00Z",
    "configuration": {},
    "sortId": 1
}
Run Code Online (Sandbox Code Playgroud)

通过 MVC 中的模型绑定,可以自动解析日期时间。该变量应位于 api 服务器的本地时区。在本例中为欧洲/柏林。我预计时间(参考示例)为 2019-12-03:00:00:00。但这种情况并非如此。现在还有一小时休息时间。

但是当我发布以下内容时:

{
    "validate": "2019-12-02T23:00:00+00:00",
    "configuration": {},
    "sortId": 1
}
Run Code Online (Sandbox Code Playgroud)

解析为本地时区按预期进行。因为发布数据的客户端是用 JS 编写的,并使用默认的 Date.toISOString() 函数,所以我总是在结尾处得到一个“Z”。根据 ISO8601,这是完全没问题的。

timezone-offset asp.net-web-api asp.net-core asp.net-core-2.2

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

在.net core中绑定原始请求体而不读取请求流

我们的一位客户坚持向我们的 API 发送原始请求正文(不是 json 或 xml),并且由于 .net core 默认情况下不支持它,所以我使用了类似的想法,如下所示:

[HttpPost]
[Route("example/{path}")]
public async Task<string> ReadStringDataManual(string path)
{
    using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
    {  
        return await reader.ReadToEndAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,在生产中我们意识到 API 在加载时会抛出以下异常。

System.Runtime.CompilerServices.TaskAwaiter:UnsafeOnCompletedInternal (method time = 1 ms, total time = 1 ms)
undefined(2011ms): await continuation

Run Code Online (Sandbox Code Playgroud)

我不确定它是否与 Kestrel 相关,但我相信这是因为大量的 I/O 操作。我还尝试了一种天真的方法 - 将带有[FromBody]属性的参数添加到方法签名中,但没有运气。

是否有其他选项可以在不使用流读取器的情况下读取原始请求正文?

谢谢。

.net c# asp.net-web-api .net-core asp.net-core

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

为什么对 Asp.NET Core MVC 控制器的 Stripe CLI HttpPost Webhook 调用(事件)会出现“System.Net.Security.dll 中的 System.IO.IOException”错误?

因此,我尝试使用 .NET Core 3.1 将 Stripe 与我的 Asp.NET Core 应用程序集成和测试,每次调用 Webhook 时都会引发异常。

这是控制器代码:

 namespace Revoow.Controllers
{
[Route("webhooks")]
[ApiController]
[AllowAnonymous]
public class StripeWebhook : ControllerBase
{
    private readonly PaymentService _service;
    private readonly string _webhookSecret;

    public StripeWebhook(IOptions<StripeOptions> options,
                         PaymentService service)
    {
        _service = service;
        _webhookSecret = options.Value.WebhookSigningKey;
    }


    [HttpPost]
    public async Task<IActionResult> Post()
    {
        Debug.WriteLine("Api Post called");
        //string json = HttpContext.Request.Body;
        var reader = new StreamReader(Request.Body);
        reader.BaseStream.Seek(0, SeekOrigin.Begin);
        var json = reader.ReadToEnd();

        try
        {
            var stripeEvent = EventUtility.ConstructEvent(json,
                Request.Headers["Stripe-Signature"], _webhookSecret);
            switch (stripeEvent.Type) …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc asp.net-web-api stripe-payments

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