MicroService4Net快速搭建微服务(二)

素颜马尾好姑娘i 2022-06-15 04:48 271阅读 0赞

接上一篇:http://blog.csdn.net/joyhen/article/details/70244666

对于config的配置,进行了自定义处理,主要是控制器的分离,以及控制器和action路由响应处理,如下:

  1. static void Main(string[] args)
  2. {
  3. const int apiport = 65511;
  4. var microService = new MicroService(
  5. port: apiport,
  6. serviceDisplayName: string.Format("直播系统API服务:{0}", apiport),
  7. serviceName: "xxLivePlatform",
  8. configure: x =>
  9. {
  10. x.Routes.MapHttpRoute(
  11. name: "DefaultApi",
  12. routeTemplate: "api/{controller}/{action}/{id}",
  13. defaults: new { id = RouteParameter.Optional }
  14. );
  15. x.Services.Replace(typeof(IAssembliesResolver), new Custom.ControllerResolver());
  16. x.Services.Replace(typeof(IHttpControllerSelector), new Custom.CHttpControllerSelector(x));
  17. x.Services.Replace(typeof(IHttpActionSelector), new Custom.CControllerActionSelector());
  18. x.Services.Replace(typeof(IHttpActionInvoker), new Custom.CControllerActionInvoker());
  19. x.MessageHandlers.Add(new Custom.CDelegatingHandler());
  20. },
  21. useCors: true);
  22. microService.Run(args);
  23. }

SouthEast

SouthEast 1

ControllerResolver:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using System.Web.Http.Dispatcher;
  5. namespace ApiService.Custom
  6. {
  7. /// <summary>
  8. /// 装载控制器
  9. /// </summary>
  10. internal class ControllerResolver : DefaultAssembliesResolver
  11. {
  12. public override ICollection<Assembly> GetAssemblies()
  13. {
  14. string[] dll = { "Controller" };
  15. foreach (var d in dll)
  16. {
  17. try
  18. {
  19. AppDomain.CurrentDomain.Load(d + ",Version=1.0.0.0,PublicKeyToken=null");
  20. }
  21. catch (System.IO.FileNotFoundException e)
  22. {
  23. Tools.LogHelp.Log(string.Format("未找到{0}.dll,程序集:Exception:{1}", d, e.Message));
  24. }
  25. catch (BadImageFormatException e)
  26. {
  27. Tools.LogHelp.Log(string.Format("{0}.dll不是有效的程序集 或 程序集版本不匹配,Exception:{1}", d, e.Message));
  28. }
  29. catch (Exception e)
  30. {
  31. Tools.LogHelp.Log(e.Message);
  32. }
  33. }
  34. return base.GetAssemblies();
  35. }
  36. }
  37. }

CHttpControllerSelector:

  1. /// <summary>
  2. /// 自定义控制器选择
  3. /// </summary>
  4. internal class CHttpControllerSelector : DefaultHttpControllerSelector
  5. {
  6. public CHttpControllerSelector(HttpConfiguration configuration)
  7. : base(configuration)
  8. {
  9. }
  10. public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
  11. {
  12. HttpControllerDescriptor decriptor = null;
  13. try
  14. {
  15. decriptor = base.SelectController(request);
  16. }
  17. catch (HttpResponseException ex)
  18. {
  19. var code = ex.Response.StatusCode;
  20. if (code == HttpStatusCode.NotFound || code == HttpStatusCode.MethodNotAllowed)
  21. {
  22. //var msg = CMessage.makemsg("请求资源不存在", -1, ex.Response.Content.ReadAsAsync<object>().Result);
  23. var msg = CMessage.makemsg("请求资源不存在001", -1);
  24. ex.Response.Content = new StringContent(msg);
  25. }
  26. throw;
  27. }
  28. return decriptor;
  29. }
  30. }

CControllerActionSelector:

  1. using System.Net;
  2. using System.Net.Http;
  3. using System.Web.Http;
  4. using System.Web.Http.Controllers;
  5. namespace ApiService.Custom
  6. {
  7. /// <summary>
  8. /// 自定义Action选择
  9. /// </summary>
  10. internal class CControllerActionSelector : ApiControllerActionSelector
  11. {
  12. public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
  13. {
  14. HttpActionDescriptor decriptor = null;
  15. try
  16. {
  17. decriptor = base.SelectAction(controllerContext);
  18. }
  19. catch (HttpResponseException ex)
  20. {
  21. var code = ex.Response.StatusCode;
  22. if (code == HttpStatusCode.NotFound || code == HttpStatusCode.MethodNotAllowed)
  23. {
  24. //var msg = CMessage.makemsg("请求资源不存在", -1, ex.Response.Content.ReadAsAsync<object>().Result);
  25. var msg = CMessage.makemsg("请求资源不存在002", -1);
  26. ex.Response.Content = new StringContent(msg);
  27. }
  28. throw;
  29. }
  30. return decriptor;
  31. }
  32. }
  33. }

CControllerActionInvoker:

  1. using System.Net.Http;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using System.Web.Http.Controllers;
  5. namespace ApiService.Custom
  6. {
  7. /// <summary>
  8. /// 自定义Action调用
  9. /// </summary>
  10. internal class CControllerActionInvoker : ApiControllerActionInvoker
  11. {
  12. public override Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
  13. {
  14. var responseMessage = base.InvokeActionAsync(actionContext, cancellationToken);
  15. var ex = responseMessage.Exception;
  16. if (ex != null)
  17. {
  18. var baseException = ex.InnerExceptions[0];
  19. var msg = CMessage.makemsg(baseException.Message, -1, ex.InnerExceptions);
  20. return Task.Run(() => new HttpResponseMessage()
  21. {
  22. Content = new StringContent(msg)
  23. }, cancellationToken);
  24. }
  25. return responseMessage;
  26. }
  27. }
  28. }

CDelegatingHandler就不贴了

发表评论

表情:
评论列表 (有 0 条评论,271人围观)

还没有评论,来说两句吧...

相关阅读

    相关 如何快速一个服务架构?

    微服务火了很久,但网上很少有文章能做到成熟地将技术传播出来,同时完美地照顾“初入微服务领域人员”,从 0 开始,采用通俗易懂的语言去讲解微服务架构的系列。所以,我们策划了这篇文