服务堆栈-尝试创建POST函数并读取JSON数据

时间:2019-07-18 17:53:59

标签: c# servicestack

我只是试图创建一个简单的POST函数,让我发布JSON。我尝试复制示例,但不确定自己在做什么。任何帮助将不胜感激,我觉得这很简单,我很想念。

我要发布的内容:

POST地址:http://localhost:49653/save/file

标题: 内容类型:application / json

未加工的身体: {   uuid:“ someUuid”,   fileName:“测试”,   dateTime:“ dateee”,   json:“一些json” }

namespace SomeNamespace.Model
{
    [Route("/save/file", "POST")]
    public class SaveFileRequest
    {
        public Stream RequestStream { get; set; }
    }

    public class SaveFileResponse
    {
        public bool Success { get; set; }
    }
}

namespace SomeNamespace.ServiceInterface
{
    [EnableCors(allowedMethods:"POST")]
    public class SaveFileService : Service
    {
        public object Any(SaveFileRequest request)
        {
            var response = new SaveFileResponse { Success = false };
            string savedataJson;

            using (var reader = new StreamReader(Request.InputStream))
            {
                savedataJson = reader.ReadToEnd();
            }

            try
            {
                Console.WriteLine(savedataJson);  // When I debug, the contents are ""
            }
            catch(Exception ex) {...}
         }
      }
   }
}

1 个答案:

答案 0 :(得分:1)

您的SaveFileRequest请求DTO需要实现IRequiresRequestStream

以下是reading directly from the request stream的文档:

直接从请求流中读取

代替注册自定义绑定程序,您可以跳过请求DTO的序列化,而可以添加IRequiresRequestStream接口以直接检索流,而无需填充请求DTO。

//Request DTO
public class RawBytes : IRequiresRequestStream
{
    /// <summary>
    /// The raw Http Request Input Stream
    /// </summary>
    Stream RequestStream { get; set; }
}

哪个告诉ServiceStack跳过尝试反序列化请求的过程,以便您可以自己读取原始的HTTP Request正文,例如:

public object Post(RawBytes request)
{
    byte[] bytes = request.RequestStream.ReadFully();
    string text = bytes.FromUtf8Bytes(); //if text was sent
}