Я новичок в веб-API, я создал веб-API, он содержит методы, которые загружают файлы.Когда я запрашиваю мой API из веб-браузера для загрузки любого файла, он загружает файл, но я не знаю, как это будет работать при нажатии кнопки.Я не понимаю, в чем я не прав, ниже приведен мой код.
Метод загрузки в API
[HttpGet]
public HttpResponseMessage DownloadContent(int? contentId, int? learnerId)
{
var classMethodName = this.GetType().Name + "|" + System.Reflection.MethodBase.GetCurrentMethod().Name;
//var uniqueId = Guid.NewGuid().ToString();
newLog.append(uniqueId, classMethodName, 75);
//HttpResponseMessage response;/
// string rootPath = "";
try
{
// for download command get path of the file
if (contentId != null && contentId.Value > 0)
{
if (learnerId == null && learnerId.Value <= 0) throw new Exception(Constants.learnerId_Is_Required);
newLog.append(uniqueId, classMethodName + " | Content Id :" + contentId + ", Learner Id :" + learnerId, 75);
// maintain the download record in LearnerContentM and increment content download count in TeacherContentM
new DownloadService().SaveContentDownload(contentId, learnerId, newLog, uniqueId);
DirectoryInfo dir = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/Files/ContentDocuments/"));
newLog.append(uniqueId, classMethodName + " | Directory :" + dir.Name, 75);
var fileName = Path.GetFileName(DownloadService.GetContentFileNameByID(contentId));
string fullPath = dir + "" + fileName;
FileInfo file = new FileInfo(fullPath);
string ContentType = "";
string extainsion = Path.GetExtension(fullPath);
switch (extainsion)
{
case ".pdf":
ContentType = "application/pdf";
break;
case ".PDF":
ContentType = "application/pdf";
break;
default:
ContentType = "text/html";
break;
}
newLog.append(uniqueId, classMethodName + " | Content Type :" + ContentType, 75);
if (String.IsNullOrEmpty(fullPath))
return Request.CreateResponse(HttpStatusCode.BadRequest);
string reqBook = fullPath;
string bookName = fileName;
//converting Pdf file into bytes array
var dataBytes = File.ReadAllBytes(reqBook);
//adding bytes to memory stream
var dataStream = new MemoryStream(dataBytes);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(dataStream);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue(ContentType);
return result;
}
else
{
newLog.append(uniqueId, classMethodName + " | Learner and Content Id's are empty.", 75);
throw new Exception(Constants.contentId_Is_Required);
}
}
catch (Exception ex)
{
newLog.append(uniqueId, classMethodName + " | Exception :" + ex.Message + "\t Inner Exception : " + ex.InnerException, 75);
HttpResponseMessage httpResponse = new HttpResponseMessage();
httpResponse.StatusCode = HttpStatusCode.BadRequest;
httpResponse.Content = null;
httpResponse.ReasonPhrase = ex.Message;
return httpResponse;
}
}
Приведенный выше код работает нормально, если я запрашиваю его убраузер загружает файл, но когда я пытаюсь вызвать его из кода, он идет не так.ниже мой код при нажатии кнопки.
if (e.CommandName == "download")
{
// get content id from row hidden field
int contentId = getIdFromHiddenField(e.Item.FindControl("hidContentId") as HiddenField);
// get learner id from hidden field
int learnerId = getIdFromHiddenField(hidLearnerId);
// for download command get path of the file
HiddenField hidFileName = e.Item.FindControl("hidFileName") as HiddenField;
if (hidFileName != null)
{
string serviceData = string.Format("api/Bilyak/DownloadContent?contentId={0}&learnerId={1}", contentId, learnerId);
HttpResponseMessage oData = DatabaseServices.DownloadContent(serviceData);
if (oData.IsSuccessStatusCode)
{
// Don't understand what should i do here....
}
}
}
Я не знаю, правильно ли я поступаю или нет.Любая помощь будет оценена ...