2

我有以下 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,如果是第二个路径,流当然是 N​​ullStream。对于第一个路径,流很好,但 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?

4

1 回答 1

2

使用 aIRequiresRequestStream告诉 ServiceStack 跳过请求绑定并让您的服务从未缓冲的请求流中读取。

但是,如果您只想处理文件上传,则可以使用RequestContext.Files. 例如:

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示例展示了如何访问多个上传文件的字节流,例如:

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("/");
}
于 2013-10-11T19:13:24.630 回答