{"id":815,"date":"2018-01-30T13:35:34","date_gmt":"2018-01-30T12:35:34","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=815"},"modified":"2021-06-10T10:38:59","modified_gmt":"2021-06-10T09:38:59","slug":"c-webapi-stream-content","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-webapi-stream-content\/","title":{"rendered":"C# WebAPI Stream content"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace Example {\n    public class ExampleApiController : ApiController {\n\n        [HttpGet]\n        [Route (\"api\/content-stream\/example\")]\n        public HttpResponseMessage GetContentStream () {\n            try {\n                var response = new HttpResponseMessage (HttpStatusCode.OK);\n                response.Content = new PushStreamContent (\n                    async (outputStream, httpContext, transportContext) => {\n                        try {\n                            Stream memoryStream = new MemoryStream (\"data from a custom stream\");\n                            memoryStream.Position = 0;\n                            await memoryStream.CopyToAsync (outputStream);\n                            memoryStream.Flush ();\n                            memoryStream.Close ();\n                        } finally {\n                            \/\/ Close output stream as we are done\n                            outputStream.Flush ();\n                            outputStream.Close ();\n                        }\n                    },\n                    \"application\/octet-stream\"\n                );\n\n                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue (\"attachment\") {\n                    FileName = \"data.txt\"\n                };\n                return response;\n            } catch (Exception ex) {\n                Log.Error (ex);\n                return ResponseHelper.FromException (Request, ex);\n            }\n        }\n    }\n\n    public class TaskValidationResult {\n        public TaskValidationResult () {\n\n        }\n\n        public TaskValidationResult (string message, string property = null, object target = null) {\n            Message = message;\n            Property = property;\n            Target = target;\n        }\n\n        public string Message;\n        public string Property;\n        public object Target;\n    }\n\n    public class TaskResult&lt;T> {\n        public bool Success {\n            get {\n                return !ValidationResults.Any ();\n            }\n        }\n\n        public T Result;\n        public int TotalResultCount = 0;\n        public IList&lt;TaskValidationResult> ValidationResults = new List&lt;TaskValidationResult> ();\n    }\n\n    public class ResponseHelper {\n        public static HttpResponseMessage FromSuccess&lt;T> (HttpRequestMessage request, T result, HttpStatusCode successCode = HttpStatusCode.OK) {\n            return request.CreateResponse (successCode, result, \"application\/json\");\n        }\n\n        public static HttpResponseMessage FromFail (HttpRequestMessage request, string message, HttpStatusCode failCode = HttpStatusCode.BadRequest) {\n            var validationResults = new List&lt;TaskValidationResult> {\n            new TaskValidationResult (message)\n            };\n            return request.CreateResponse (failCode, validationResults, \"application\/json\");\n        }\n\n        public static HttpResponseMessage FromFail (HttpRequestMessage request, IEnumerable&lt;TaskValidationResult> validationResults, HttpStatusCode failCode = HttpStatusCode.BadRequest) {\n            return request.CreateResponse (failCode, validationResults, \"application\/json\");\n        }\n\n        public static HttpResponseMessage FromTaskResult&lt;T> (HttpRequestMessage request, TaskResult&lt;T> result, HttpStatusCode successCode = HttpStatusCode.OK, HttpStatusCode failCode = HttpStatusCode.BadRequest) {\n            if (result.Success) {\n                var response = request.CreateResponse (successCode, result.Result, \"application\/json\");\n                response.Headers.Add (\"X-TotalCount\", result.TotalResultCount.ToString ());\n                return response;\n            } else {\n                return request.CreateResponse (failCode, result.ValidationResults);\n            }\n        }\n\n        public static HttpResponseMessage FromException (HttpRequestMessage request, Exception ex, HttpStatusCode statusCode = HttpStatusCode.InternalServerError) {\n#if DEBUG\n            return request.CreateResponse (statusCode, ex, \"application\/json\");\n#else\n            return request.CreateResponse (statusCode, \"\");\n#endif\n        }\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-815","post","type-post","status-publish","format-standard","hentry","category-dotnet"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/815","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=815"}],"version-history":[{"count":4,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/815\/revisions"}],"predecessor-version":[{"id":5115,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/815\/revisions\/5115"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}