private void AddHttpServiceRouter(Type type, MethodInfo m, RpcServiceAttribute sAttr, RpcMethodAttribute mAttr, RouterAttribute rAttr, HttpRouteOptions options) { var item = new RouteItem { Path = rAttr.Path, AcceptVerb = rAttr.AcceptVerb, Category = rAttr.Category, InvokeMethod = m, MessageId = mAttr.MessageId, ServiceId = sAttr.ServiceId }; //special MessageId; var args = new object[] { this.specialMessageId }; item.InvokeService = this._proxyCreate.MakeGenericMethod(type).Invoke(this._proxy, args); if (rAttr.PluginType != null) { item.Plugin = ActivatorUtilities.CreateInstance(this._provider, rAttr.PluginType) as IHttpPlugin; } options.Items.Add(item); _logger.LogDebug("url:{0},verb:{1},service:{2},method:{3}", item.Path, item.AcceptVerb, type.Name.Split('.').Last(), m.Name); }
protected virtual void ProcessRequestData(HttpRequest req, RouteItem router, HttpRequestData requestData) { var method = req.Method.ToLower(); requestData.ServiceId = router.ServiceId; requestData.MessageId = router.MessageId; CollectQuery(req.Query, requestData.QueryOrFormData); string contentType = ""; if (method == "post" || method == "put") { if (!string.IsNullOrEmpty(req.ContentType)) { contentType = req.ContentType.ToLower().Split(';')[0]; } } if (contentType == "application/x-www-form-urlencoded" || contentType == "multipart/form-data") { CollectForm(req.Form, requestData.QueryOrFormData); } else if (contentType == "application/json") { requestData.RawBody = CollectBody(req.Body); } }
private async Task <bool> ProcessOutput(HttpRequest req, HttpResponse res, RouteItem routeItem, object retVal) { var resMsg = await GetJsonResult(retVal); SetContentType(req, res, resMsg); //输出前置处理 if (routeItem.Plugin is IHttpPostProcessPlugin postPlugin) { var ret = await postPlugin.PostProcessAsync(req, res, resMsg, routeItem); if (ret) { return(ret); } } if (routeItem.Plugin is IHttpOutputPlugin outputPlugin) { var ret = await outputPlugin.OutputAsync(req, res, resMsg, routeItem); return(ret); } await res.WriteAsync(this._jsonParser.ToJson(resMsg)); return(true); }
private async Task <bool> ParseRequestAsync(HttpRequest req, HttpResponse res, HttpRequestData requestData, RouteItem router) { bool result = false; IHttpParsePlugin plugin = null; if (router.Plugin is IHttpParsePlugin parsePlugin) { plugin = parsePlugin; } requestData.MessageId = router.MessageId; requestData.ServiceId = router.ServiceId; if (plugin != null) { result = await plugin.ParseAsync(req, res, requestData, router); CollectCommonData(req, requestData.QueryOrFormData); return(result); } try { ProcessRequestData(req, router, requestData); CollectCommonData(req, requestData.QueryOrFormData); } catch (Exception ex) { res.StatusCode = (int)HttpStatusCode.InternalServerError; await res.WriteAsync("InternalServerError:" + ex.Message); _logger.LogError(ex, "cast http request to rpc error"); return(true); } return(result); }
protected virtual async Task <bool> BeforeAsyncCall(HttpRequest req, HttpResponse res, HttpRequestData requestData, RouteItem routeItem) { if (_parsers != null) { foreach (var parser in this._parsers) { var ret = await parser.ParseAsync(req, res, requestData, routeItem); if (ret) { return(ret); } } } return(false); }
private async Task <bool> ProcessOutput(HttpRequest req, HttpResponse res, RouteItem routeItem, object retVal) { var resMsg = await GetJsonResult(retVal); SetContentType(req, res, resMsg); //输出前置处理 if (routeItem.Plugin is IHttpPostProcessPlugin postPlugin) { var ret = await postPlugin.PostProcessAsync(req, res, resMsg, routeItem); if (ret) { return(ret); } } if (routeItem.Plugin is IHttpOutputPlugin outputPlugin) { var ret = await outputPlugin.OutputAsync(req, res, resMsg, routeItem); return(ret); } //response await res.WriteAsync("{\""); await res.WriteAsync(this._gatewayOptions.WrapperCodeFieldName); await res.WriteAsync("\":"); await res.WriteAsync(resMsg.Code.ToString()); await res.WriteAsync(",\""); await res.WriteAsync(this._gatewayOptions.WrapperMessageFieldName); await res.WriteAsync("\":\""); await res.WriteAsync(resMsg.Message ?? ""); await res.WriteAsync("\""); if (resMsg.Data != null) { string dataJson = this._jsonParser.ToJson(resMsg.Data); await res.WriteAsync(",\""); await res.WriteAsync(this._gatewayOptions.WrapperDataFieldName); await res.WriteAsync("\":"); await res.WriteAsync(dataJson); } else { await res.WriteAsync(",\""); await res.WriteAsync(this._gatewayOptions.WrapperDataFieldName); await res.WriteAsync("\":{}"); } await res.WriteAsync("}"); return(true); }
private async Task <bool> ParsePostRequestAsync(HttpRequest req, HttpResponse res, RouteItem router, HttpRequestData requestData) { bool result = false; IHttpPostParsePlugin plugin = null; if (router.Plugin != null && router.Plugin is IHttpPostParsePlugin) { plugin = router.Plugin as IHttpPostParsePlugin; } if (plugin != null) { result = await plugin.PostParseAsync(req, res, requestData, router); return(result); } return(result); }