Downloading Documents via .Net web api from azure blob
I having a tough time figuring out what is going wrong. My app hits the api to fetch a document. What is happening is the download starts,but hangs. Eventually it will finish (either with an error or completely), but when I attempt to open say a pdf, I get a "cannot open pdf" or something along those lines. It works locally.
my controller:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<IHttpActionResult> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/x-download";
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
response.AddHeader("content-disposition", string.Format("attachment; filename={0}", removePath));
response.AddHeader("content-length", attachment.Length.ToString());
response.BinaryWrite(attachment);
response.Flush();
return null;
}
my repository:
public async Task<byte> GetAttachmentAsync(string fileName)
{
var container = _blobClient.GetContainerReference(_containerName);
var blockBlob = container.GetBlockBlobReference(fileName);
using (var memoryStream = new MemoryStream())
{
await blockBlob.DownloadToStreamAsync(memoryStream);
return memoryStream.ToArray();
}
}
c# asynchronous asp.net-web-api azure-blob-storage
add a comment |
I having a tough time figuring out what is going wrong. My app hits the api to fetch a document. What is happening is the download starts,but hangs. Eventually it will finish (either with an error or completely), but when I attempt to open say a pdf, I get a "cannot open pdf" or something along those lines. It works locally.
my controller:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<IHttpActionResult> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/x-download";
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
response.AddHeader("content-disposition", string.Format("attachment; filename={0}", removePath));
response.AddHeader("content-length", attachment.Length.ToString());
response.BinaryWrite(attachment);
response.Flush();
return null;
}
my repository:
public async Task<byte> GetAttachmentAsync(string fileName)
{
var container = _blobClient.GetContainerReference(_containerName);
var blockBlob = container.GetBlockBlobReference(fileName);
using (var memoryStream = new MemoryStream())
{
await blockBlob.DownloadToStreamAsync(memoryStream);
return memoryStream.ToArray();
}
}
c# asynchronous asp.net-web-api azure-blob-storage
You're not returning any response back... you should return something that implementsIHttpActionResult
– Thomas
Jan 3 at 5:57
add a comment |
I having a tough time figuring out what is going wrong. My app hits the api to fetch a document. What is happening is the download starts,but hangs. Eventually it will finish (either with an error or completely), but when I attempt to open say a pdf, I get a "cannot open pdf" or something along those lines. It works locally.
my controller:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<IHttpActionResult> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/x-download";
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
response.AddHeader("content-disposition", string.Format("attachment; filename={0}", removePath));
response.AddHeader("content-length", attachment.Length.ToString());
response.BinaryWrite(attachment);
response.Flush();
return null;
}
my repository:
public async Task<byte> GetAttachmentAsync(string fileName)
{
var container = _blobClient.GetContainerReference(_containerName);
var blockBlob = container.GetBlockBlobReference(fileName);
using (var memoryStream = new MemoryStream())
{
await blockBlob.DownloadToStreamAsync(memoryStream);
return memoryStream.ToArray();
}
}
c# asynchronous asp.net-web-api azure-blob-storage
I having a tough time figuring out what is going wrong. My app hits the api to fetch a document. What is happening is the download starts,but hangs. Eventually it will finish (either with an error or completely), but when I attempt to open say a pdf, I get a "cannot open pdf" or something along those lines. It works locally.
my controller:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<IHttpActionResult> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/x-download";
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
response.AddHeader("content-disposition", string.Format("attachment; filename={0}", removePath));
response.AddHeader("content-length", attachment.Length.ToString());
response.BinaryWrite(attachment);
response.Flush();
return null;
}
my repository:
public async Task<byte> GetAttachmentAsync(string fileName)
{
var container = _blobClient.GetContainerReference(_containerName);
var blockBlob = container.GetBlockBlobReference(fileName);
using (var memoryStream = new MemoryStream())
{
await blockBlob.DownloadToStreamAsync(memoryStream);
return memoryStream.ToArray();
}
}
c# asynchronous asp.net-web-api azure-blob-storage
c# asynchronous asp.net-web-api azure-blob-storage
asked Jan 2 at 23:39
Clinton CochraneClinton Cochrane
35
35
You're not returning any response back... you should return something that implementsIHttpActionResult
– Thomas
Jan 3 at 5:57
add a comment |
You're not returning any response back... you should return something that implementsIHttpActionResult
– Thomas
Jan 3 at 5:57
You're not returning any response back... you should return something that implements
IHttpActionResult
– Thomas
Jan 3 at 5:57
You're not returning any response back... you should return something that implements
IHttpActionResult
– Thomas
Jan 3 at 5:57
add a comment |
1 Answer
1
active
oldest
votes
Try changing your controller code to:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(attachment)
};
result.Content.Headers.ContentDisposition =
new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
FileName = removePath
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}
I made one change to your code and it worked perfectly. I changed the signature topublic async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
I can't upvote you,but this was what I needed. Thank you so much
– Clinton Cochrane
Jan 3 at 14:02
Of course, will update my answer
– matt_lethargic
Jan 3 at 14:19
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54014607%2fdownloading-documents-via-net-web-api-from-azure-blob%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Try changing your controller code to:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(attachment)
};
result.Content.Headers.ContentDisposition =
new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
FileName = removePath
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}
I made one change to your code and it worked perfectly. I changed the signature topublic async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
I can't upvote you,but this was what I needed. Thank you so much
– Clinton Cochrane
Jan 3 at 14:02
Of course, will update my answer
– matt_lethargic
Jan 3 at 14:19
add a comment |
Try changing your controller code to:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(attachment)
};
result.Content.Headers.ContentDisposition =
new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
FileName = removePath
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}
I made one change to your code and it worked perfectly. I changed the signature topublic async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
I can't upvote you,but this was what I needed. Thank you so much
– Clinton Cochrane
Jan 3 at 14:02
Of course, will update my answer
– matt_lethargic
Jan 3 at 14:19
add a comment |
Try changing your controller code to:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(attachment)
};
result.Content.Headers.ContentDisposition =
new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
FileName = removePath
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}
Try changing your controller code to:
[Route("api/listing/attachment")]
[HttpGet]
public async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
{
var attachment = await _repository.GetAttachmentAsync(fileName);
var removePath = fileName.Substring(fileName.IndexOf("/", fileName.IndexOf("/", StringComparison.Ordinal) + 1, StringComparison.Ordinal) + 1);
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(attachment)
};
result.Content.Headers.ContentDisposition =
new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
FileName = removePath
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;
}
edited Jan 3 at 14:20
answered Jan 3 at 10:21


matt_lethargicmatt_lethargic
2,10511227
2,10511227
I made one change to your code and it worked perfectly. I changed the signature topublic async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
I can't upvote you,but this was what I needed. Thank you so much
– Clinton Cochrane
Jan 3 at 14:02
Of course, will update my answer
– matt_lethargic
Jan 3 at 14:19
add a comment |
I made one change to your code and it worked perfectly. I changed the signature topublic async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
I can't upvote you,but this was what I needed. Thank you so much
– Clinton Cochrane
Jan 3 at 14:02
Of course, will update my answer
– matt_lethargic
Jan 3 at 14:19
I made one change to your code and it worked perfectly. I changed the signature to
public async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
I can't upvote you,but this was what I needed. Thank you so much– Clinton Cochrane
Jan 3 at 14:02
I made one change to your code and it worked perfectly. I changed the signature to
public async Task<HttpResponseMessage> GetAttachmentAsync(string fileName)
I can't upvote you,but this was what I needed. Thank you so much– Clinton Cochrane
Jan 3 at 14:02
Of course, will update my answer
– matt_lethargic
Jan 3 at 14:19
Of course, will update my answer
– matt_lethargic
Jan 3 at 14:19
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54014607%2fdownloading-documents-via-net-web-api-from-azure-blob%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
You're not returning any response back... you should return something that implements
IHttpActionResult
– Thomas
Jan 3 at 5:57