使用C#快速搭建Rest服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C#快速搭建Rest服务相关的知识,希望对你有一定的参考价值。

参考技术A 为了能够在桌面端软件中简单方便的对外提供RestApi接口,参考Java SpringMVC框架使用C#语言编写了一个简易RestApi服务器框架,目前支持:

- 静态页面处理

- GET/POST/PUT/DELETE请求

- 支持返回JSON

- 支持路由方法

- 支持自定义过滤器

- 服务器返回数据支持gzip压缩

- 支持Component变量自动注入

- 支持Component自动扫描

- GET/POST支持查询参数,POST支持body数据

- 注解支持

  - Component

  - WebFilter

  - RequestMapping

  - Autowired

  - RequestBody

  - RequestParam

new RestApplicationServer().run(new RestConfiguration

    StaticFileConfigurations = new List<StaticFileConfiguration>()

        new StaticFileConfiguration("/e", "E:\\"),

        new StaticFileConfiguration("/f", "F:\\")

   

);

// 将 http://xxxxx.com/e/xxxxx 映射到本地磁盘文件 E:\\xxxxx

// 将 http://xxxxx.com/f/xxxxx 映射到本地磁盘文件 F:\\xxxxx

1.添加Controller

        [Component("PersonController")]

    public class PersonController

   

        [Autowired]

        public PersonService personService;

        private ILogger logger = LoggerFactory.GetLogger();

        [RequestMapping("GET","/api/person/list")]

        public List<Person> GetPersonList()

       

            return personService.GetPersonList();

       

        [RequestMapping("GET", "/api/person")]

        public Person GetPerson([RequestParam("id")]int id)

       

            logger.Debug("id:"+id);

            return personService.GetPerson((int)id);

       

        [RequestMapping("POST", "/api/person")]

        public string Create([RequestBody] Person person)

       

            logger.Info("person:" + person.ToString());

            return "ok";

       

   

2.添加Service

    [Component("PersonService")]

    public class PersonService

   

        private ILogger logger = new ConsoleLogger();

        public List<Person> GetPersonList()

            return TestData.PersonList;

       

        public Person GetPerson(int id)

       

            return TestData.PersonList.Find(x => x.id == id);

       

        public void Create(Person person)

       

            logger.Debug(person.ToString());

       

   

3.启动服务

controller和service上增加Component注解后,服务启动时会进行自动扫描

class Program



    static void Main(string[] args)

   

        new RestApplicationServer().run();

   



1. 添加一个计算接口处理耗时的filter

[WebFilter(1, "/")]

    public class StopWacthFilter : IFilter

   

        public void Filter(HttpRequest request,ref HttpResponse response, ProcessChain chain, int nextIndex)

       

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            chain.doFilter(request,ref response, nextIndex);

            stopwatch.Stop();

            Console.WriteLine(request.Method + " "+request.Path+ ", 耗时:"+(stopwatch.ElapsedMilliseconds).ToString()+"ms");

       

   

自定义filter上增加WebFilter注解后,服务启动时会进行自动扫描

项目地址: https://github.com/13401095975/RestServer

使用 Java 客户端使用 C# REST 服务

【中文标题】使用 Java 客户端使用 C# REST 服务【英文标题】:Consume C# REST service with Java client 【发布时间】:2017-03-31 20:50:28 【问题描述】:

我有以下 C# REST 服务定义

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "books/isbn")]
void CreateBook(string isbn, Book book);

我想从 Java 客户端使用此服务。

    String detail = "<Book><Autor>" + autor + "</Autor><ISBN>" + isbn + "</ISBN><Jahr>" + jahr + "</Jahr><Titel>" + titel + "</Titel></Book>";
    URL urlP = new URL("http://localhost:18015/BookRestService.svc/books/" + isbn);
    HttpURLConnection connectionP = (HttpURLConnection) urlP.openConnection();
    connectionP.setReadTimeout(15*1000);
    connectionP.setConnectTimeout(15*1000);
    connectionP.setRequestMethod("POST");
    connectionP.setDoOutput(true);
    connectionP.setRequestProperty("Content-Type", "application/xml"); 
    connectionP.setRequestProperty("Content-Length", Integer.toString( detail.length() )); 
    OutputStream os = connectionP.getOutputStream();
    PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
    pw.println(detail);
    pw.flush();
    pw.close();
    int retc = connectionP.getResponseCode();
    connectionP.disconnect();

服务向我的 Java 客户端返回 400。从 C# 客户端调用时,相同的服务可以正常工作。

【问题讨论】:

400 意味着一个错误的请求 - 但通常服务器会告诉你它有什么问题(格式错误的 XML、缺少标头等)。所以很高兴看到状态行和响应的正文内容。此外,使用实际的休息客户端可能有助于理解这个问题。 (弹簧架模板,cxf,...) 要完成@JoeriHendrickx 的回答,我想说您有两个客户的不同响应,原因很简单:您发送的请求不同。您可以使用requestb.in 等工具来分析两个客户端实际发送的http 请求,看看有什么不同。您也可以在此处发布结果。 【参考方案1】:

我认为您写入流的方式可能是原因,试试这个:

connectionP.setDoOutput(true);
DataOutputStream out = new DataOutputStream(connectionP.getOutputStream());
out.writeBytes(detail);
out.flush();
out.close();

【讨论】:

【参考方案2】:

在您的服务器代码中,您使用 UriTemplate = "books/isbn 作为 URI 模板,但您的客户端代码将 URI 指定为 "http://localhost:18015/BookRestService.svc/booksplain/" + isbn

也许您只需要更改 Java 代码中的 URI 以反映服务器 URI,例如“books”而不是“booksplain”"http://localhost:18015/BookRestService.svc/books/" + isbn

另外,如果您有兴趣使您的代码更简洁,请考虑使用Spring RestTemplate 进行 REST API 调用。

【讨论】:

感谢您指向书籍与书本。这是一个错字。我实际上用书籍尝试过,但它不起作用。

以上是关于使用C#快速搭建Rest服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Ribbon快速搭建

C# 快速开发框架搭建—开发工具介绍

如何使用nodejs快速搭建本地服务器

快速搭建.net core并在Linux服务器上运行

WebSocket搭建 (node.js、c#作为服务器)

如何使用nodejs快速搭建本地服务器