我有以下DTO:
[Route("/images/{imageId}/upload", "PUT")]
public class GetImageWithStream : IRequiresRequestStream
{
public Stream RequestStream { get; set; }
public string imageId { get; set; }
}
///images/{imageId}/upload?url={imageUrl}
[Route("/images/{imageId}/upload", "PUT")]
public class GetImageWithUri
{
public string imageId { get; set; }
public string url { get; set; }
}
/ images / 1 / upload - >这应该转到第一个DTO
/images/1/upload?url=something.jpg - >这应该发送到第二个DTO
现在它们都被路由到第一个DTO,而在第二个路径的情况下,流当然是NullStream。使用第一个路径,流是好的,但imageId为空。
或者我可以想象这样的事情:
[Route("/images/{imageId}/upload", "PUT")]
public class GetImageWithStream : IRequiresRequestStream
{
public Stream RequestStream { get; set; }
public string imageId { get; set; }
public string url { get; set; }
}
是否可以在ServiceStack中以不同的方式处理相同的PATH?
答案 0 :(得分:2)
使用IRequiresRequestStream
告诉ServiceStack跳过请求绑定并让您的服务从未缓冲的请求流中读取。
但是,如果您只想handle file uploads,则可以使用RequestContext.Files
独立于请求DTO访问上传的文件。 e.g:
public object Post(MyFileUpload request)
{
if (this.Request.Files.Length > 0)
{
var uploadedFile = this.Request.Files[0];
uploadedFile.SaveTo(MyUploadsDirPath.CombineWith(file.FileName));
}
return HttpResult.Redirect("/");
}
ServiceStack的imgur.servicestack.net示例显示了如何访问byte stream of multiple uploaded files,例如:
public object Post(Upload request)
{
foreach (var uploadedFile in Request.Files
.Where(uploadedFile => uploadedFile.ContentLength > 0))
{
using (var ms = new MemoryStream())
{
uploadedFile.WriteTo(ms);
WriteImage(ms);
}
}
return HttpResult.Redirect("/");
}