我正在使用 WatsonWebserver 包实现网络服务器逻辑。在请求处理程序中,可能需要向第 3 方网络服务器发送另一个请求并处理来自它的响应。有时,第 3 方网络服务器可能会返回错误请求错误,并显示缺少某些参数的消息。然后我的网络服务器将此响应发送给客户端。此时我希望客户向我发送缺少参数的新请求。是否可以在阻塞模式下使用现有的 HttpContextBase 对象在同一处理程序中与客户端进行通信?
using WatsonWebserver;
using WatsonWebserver.Core;
using Newtonsoft.Json.Linq;
using System.Net;
namespace GoogleAuthRequester
{
internal class Program
{
static void Main(string[] args)
{
WatsonWebserver.Core.WebserverSettings settings = new WatsonWebserver.Core.WebserverSettings("127.0.0.1", 9000, false);
WatsonWebserver.Webserver server = new WatsonWebserver.Webserver(settings, DefaultRoute);
server.Start();
Console.ReadLine();
}
static async Task DefaultRoute(HttpContextBase ctx)
{
JObject json = JObject.Parse(ctx.Request.DataAsString);
// some logic here
// sending request to 3rd party
HttpClient httpClient = new HttpClient();
using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://3rdpartyservice/json/" + json);
using HttpResponseMessage response = httpClient.Send(request);
if(response.StatusCode == HttpStatusCode.BadRequest)
{
ctx.Response.StatusCode = 400;
await ctx.Response.Send(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());
}
// Here I want to wait for a new request from the client with all needed parameters
// Then send these parameters to 3rd party again
}
}
}
是否可以在 DefaultRoute 任务的同一实例中获取新请求,或者我应该通过为请求(上下文)生成唯一 id 并在此 id 之上构建我的逻辑来以其他方式处理它?
路由(在您的情况下为默认路由)并不意味着以与原始调用者保持持久连接的方式使用。我会将状态返回给用户(例如
Bad Request
,状态 400)以及正确执行请求所需的任何信息。
尝试在路由内部拥有某种状态机,这在某种程度上违反了 RESTful 架构的核心原则。您在识别失败的请求后对呼叫者的回复应该为他们提供提交不会失败的new请求所需的信息。