我有一个带有 .NET 5 的 Web API 项目(直接从 Visual Studio Asp.NET Core Web API 的模板创建),它在从 Visual Studio 调试时工作得很好,尝试将它部署到具有 Hosting Bundle 的 IIS 服务器.NET 5 安装后,部署显然运行良好,但是当我输入 url 时,我有一个 404。有一个单独的 MVC .NET 5 项目,我以相同的方式部署它并且它运行得非常好。
想知道是否有人可以指出我正确的方向,在这里找不到我缺少的东西。
这个问题与使用 Chrome Serial API 时发生的情况有关,但可能与任何 ReadableStream 相关。我研究了文档,可能错过了一些功能或模式。
一个简单的程序在 Chrome 浏览器中运行,访问 CW 键控器(基于 Arduino,但这并不重要)。
应用程序向键控器发送命令,并期望两个二进制字节或字符串作为响应(特定格式取决于发送的命令,并不重要)。
如果串行设备(不是 USB/串行适配器,而是 Arduino)由于某种原因错过了该命令,则永远不会发送响应,并且expectResponse()下面的函数将永远不会返回任何数据,也不会抛出任何异常。结果,Reader 保持锁定状态,ReadableStream 因此无法关闭,因此串行端口也无法关闭。
此外,根据应用程序结构,如果其他命令成功发送到键控器,则可能无法读取第二个响应,因为第一个读取器会阻塞流,并且在它被释放之前,无法创建新的读取器。
async function expectResponse( serialPort ) {
const reader = serialPort.readable.getReader() ;
let { value, done } = await reader.read() ; // this never returns because no data arrive, not possible to "break"
}
async function disconnect( serialPort ) {
// ... some cleanup ...
// naive attempt to unlock ReadableStream before closing
await serialPort.readable.getReader().releaseLock() // this will throw …Run Code Online (Sandbox Code Playgroud) 我想关闭我的 ABP 项目中特定应用程序服务的自动 WebAPI 生成服务。
那么,问题是为什么在 using 块中使用 HttpClient 是错误的,但在 WebApi 上下文中呢?
我一直在阅读这篇文章“不要阻止异步代码”。其中我们有以下示例:
public static async Task<JObject> GetJsonAsync(Uri uri)
{
// (real-world code shouldn't use HttpClient in a using block; this is just example code)
using (var client = new HttpClient())
{
var jsonString = await client.GetStringAsync(uri);
return JObject.Parse(jsonString);
}
}
// My "top-level" method.
public class MyController : ApiController
{
public string Get()
{
var jsonTask = GetJsonAsync(...);
return jsonTask.Result.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
评论// (real-world code shouldn't use HttpClient in a using …
我正在尝试使用 XUnit 对 Web API 中的控制器内的方法进行单元测试。该方法的作用是从数据库中按 ISBN 获取单个书名。我在单元测试期间遇到的问题是,我不确定如何插入必须执行测试的虚拟数据,以及 Assert 函数如何工作。
标题控制器.cs
[ApiController]
[Route("titlecontroller")]
public class TitleController : Controller
{
private IGtlTitleRepository _gtlTitleRepository;
public TitleController(IGtlTitleRepository gtlTitleRepository)
{
_gtlTitleRepository = gtlTitleRepository;
}
[Route("getTitle/{ISBN}")]
[HttpGet()]
public GtlTitle GetTitle(string ISBN)
{
return _gtlTitleRepository.GetTitle(ISBN);
}
}
Run Code Online (Sandbox Code Playgroud)
IGtlTitleRepository.cs
public interface IGtlTitleRepository
{
GtlTitle GetTitle(string ISBN);
}
Run Code Online (Sandbox Code Playgroud)
MockGtlTitleRepository.cs
public class MockGtlTitleRepository : IGtlTitleRepository
{
private readonly string _connection;
public MockGtlTitleRepository(IOptions<ConnectionStringList> connectionStrings)
{
_connection = connectionStrings.Value.GTLDatabase;
}
private List<GtlTitle> _titleList;
public GtlTitle GetTitle(string ISBN)
{
using (var connection …Run Code Online (Sandbox Code Playgroud) 我正在尝试从此链接实施验证。
我不想要其中的 OAuth 部分,而是使用公钥和标头来验证数据。我看过很多与 SendGrid 的 Event Webhook 相关的帖子,但没有任何内容可以验证。
这就是我尝试过的,但显然有些问题。我真的不知道如何将文档中的代码转换为 C#。我不确定请求中的每条数据应该放在哪里。有人对此有任何见解吗?
public async Task<IHttpActionResult> EventsHook()
{
IEnumerable<string> signatureFromHeader = Request.Headers.GetValues("X-Twilio-Email-Event-Webhook-Signature");
byte[] timeStampBytes = Encoding.ASCII.GetBytes(Request.Headers.GetValues("X-Twilio-Email-Event-Webhook-Timestamp").First());
byte[] body = await Request.Content.ReadAsByteArrayAsync();
byte[] payloadHash = timeStampBytes.Concat(body).ToArray();
byte[] signatureByteArray = Convert.FromBase64String(signatureFromHeader.First());
var publicKey = "{myPublicKey}";
byte[] publicKeyBytes = Convert.FromBase64String(publicKey);
var ecdsaParams = new ECParameters
{
D = publicKeyBytes
};
using (var ecdsa = ECDsa.Create(ecdsaParams))
{
if (ecdsa.VerifyData(payloadHash, signatureByteArray, HashAlgorithmName.SHA256))
{
return Ok();
}
return StatusCode(System.Net.HttpStatusCode.Forbidden);
}
}
Run Code Online (Sandbox Code Playgroud) 我在尝试解决之前的问题时暂时创建了一个RTCPeerConnectionwithout any 。iceServers
let peer = new RTCPeerConnection();
Run Code Online (Sandbox Code Playgroud)
这在我的本地网络上运行得很好。
但是,不在同一网络上的设备(例如,4G 上的移动设备)将无法连接。我记得我必须iceServers向RTCPeerConnection构造函数中添加一些内容。
let peer = RTCPeerConnection(
{
iceServers: [
{
urls: [
"stun:stun1.l.google.com:19302",
"stun:stun2.l.google.com:19302",
],
},
{
urls: [
"stun:global.stun.twilio.com:3478?transport=udp",
],
},
],
iceCandidatePoolSize: 10,
}
);
Run Code Online (Sandbox Code Playgroud)
这样做之后,我的 WebRTC 连接就一直停留在连接状态。即使在我的本地网络上,也没有一个连接成功。(不再是这种情况,请参阅下面的编辑2)
这是连接的状态:
编辑:看起来当我留空时iceServers,连接仍然收集一个ice候选者,所以我假设我的浏览器(chrome)提供了一个默认的ice服务器。在这种情况下,只有我的自定义 Ice 服务器(如上所示)导致了问题,而不是浏览器默认值。
编辑 2:新观察
我已经添加了大量的日志记录,每当我包含以下内容时,我都会注意到一些内容iceServers:
每当对等点 A 在一段时间内第一次发起与对等点 B 的连接时,对等点 B 就会收集两个ice 候选者:1 个本地主机候选者和 1 …
我的 GraphQL 查询类中有一个非常简单的 IQueryable。我想要完成的是获取请求聊天信息的授权用户。将 context.Chats 更改为 context.Chats.Where(i => i.UserId == RequestingId)。所以你无法从我的 API 获取私人聊天。如果您未获得授权,那么您将始终收到一个空列表。我已经了解了如何使用 MVC 控制器执行此操作,但这不是所需的结果。
public class Query
{
[UseDbContext(typeof(AppDbContext))]
[UseFiltering]
[UseSorting]
public IQueryable<Chat> GetChats([ScopedService] AppDbContext context)
{
return context.Chats
.Include(m => m.Messages)
.Include(r => r.Recipients);
}
}
Run Code Online (Sandbox Code Playgroud) HTMLElement元素的类型是什么,例如
<strong><cite><article>?
根据 MDN 的HTML 元素参考,元素比下面的类型多得多HTMLElement(请参阅此列表)。
我正在使用 TypeScript 对元素进行一些处理,并希望使用最具体的类型存储对它们的引用。虽然许多其他元素都清晰命名类型(例如HTMLDivElement,HTMLImageElement和HTMLTableElement),似乎我上面列出的元素不会有任何相应的类型。
当 javascript 运行时找到 setTimeout() 方法时,会将其发送到事件表。运行时如何知道 setTimeout() 是 WEB API?它是否首先在当前上下文中查找 setTimeout() 方法,如果没有找到,则将其假定为 WEB API?
webapi ×10
c# ×4
javascript ×4
.net-5 ×1
.net-core ×1
abp ×1
dom ×1
ecdsa ×1
graphql ×1
hotchocolate ×1
html ×1
httpclient ×1
sendgrid ×1
serial-port ×1
settimeout ×1
typescript ×1
unit-testing ×1
using ×1
webrtc ×1
xunit ×1