另一个人在这里问了我确切的问题,但没有答案: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 的异常。我可能需要一个完全不同的记录器控制器和数据库表来仅处理客户端错误 - 但如果可能的话,我希望将服务器和客户端错误记录到同一个表中。
知道这一点-我正在尝试做的事情甚至是一个好的方法吗?如果没有,任何人都可以给我一个关于如何记录这些客户端错误的高级描述吗?
我在从 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 客户端。
提前致谢。
我有一个 asp.net core web api 和 Angular 前端。应用程序向 Web API 上的控制器操作发送帖子并对用户进行身份验证。
我的问题是返回身份验证 cookie 并最终存储的正确方法是什么?我发现这个cookie 库似乎可以很好地满足我的目的。一些更具体的问题是:
感谢您花时间阅读这篇长文章。
我很难弄清楚出了什么问题。我的应用程序访问 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) 我事先在各种来源中搜索了我的问题,但答案并没有为我提供解决方案。
我使用此处介绍的方式在 .net core 2.2 项目中实现了基于 Url 的 Web api 版本控制。我用于版本控制的版本是最新的 Microsoft.AspNetCore.Mvc.Versioning 3.1.2。我还尝试从以下来源了解它是如何工作的:source1、source2、source3、source4。
我在名为 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/value和api/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) 我有一个 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 }\nRun Code Online (Sandbox Code Playgroud)\n\n如果我在发送回调试器之前查看调试器中返回的数据,它看起来像:
\n\nCreated Date,IP,Form Name,Email address,Message,Full Name\nRun Code Online (Sandbox Code Playgroud)\n\n31/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"\nRun Code Online (Sandbox Code Playgroud)\n\n整个记录集用引号括起来,换行符被视为文字,因此在 Excel 中打开文件时,所有记录都在一行中。
\n\n有一个 DelegatingHandler 会触发,但那是针对特定的 url 请求,因此对于该请求它不会执行任何操作。
\n\n有人知道发生了什么事吗?
\n现在 API 和 MVC 控制器位于同一个项目中,这很好。稍后我将添加一个 Angular 前端。但由于 Angular 前端是一个单独的项目,因此 ASP.NET Core MVC 视图成为一个单独的项目是否有意义?任何地方都有链接如何做到这一点?我想这样 2 个视图(Angular 和 ASP.NET core MVC)都会调用 WEB API 层,这看起来更合乎逻辑。..
或者,如果他们留在同一个项目中,我至少应该让 MVC 控制器调用 WEB API 控制器?或没有 ?
场景:我有一个接受 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
我们的一位客户坚持向我们的 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 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) asp.net-web-api ×10
c# ×4
angular ×3
asp.net ×3
asp.net-core ×3
.net ×2
asp.net-mvc ×2
.net-core ×1
asynchronous ×1
cookies ×1
exception ×1
http ×1
logging ×1
post ×1
versioning ×1