C# api控制器的文件下载问题
我在asp.NETMVC应用程序中下载了上述代码的一个文件。它工作得很好,因为我的控制器是继承给控制器的。但当我将此代码移动到Webapi控制器时,它在返回文件时抛出错误。经过分析,我发现webapi中的控制器继承到ApiController(system.web.http.api控制器)。我发现ApicController中没有文件类。在webapi控制器中是否有实现下载文件功能的选项 我在webapi控制器中尝试了下面的替代代码,但调用此代码后,无法看到下载文件C# api控制器的文件下载问题,c#,asp.net-mvc,angularjs,asp.net-web-api,C#,Asp.net Mvc,Angularjs,Asp.net Web Api,我在asp.NETMVC应用程序中下载了上述代码的一个文件。它工作得很好,因为我的控制器是继承给控制器的。但当我将此代码移动到Webapi控制器时,它在返回文件时抛出错误。经过分析,我发现webapi中的控制器继承到ApiController(system.web.http.api控制器)。我发现ApicController中没有文件类。在webapi控制器中是否有实现下载文件功能的选项 我在webapi控制器中尝试了下面的替代代码,但调用此代码后,无法看到下载文件 public class D
public class DefaultController : Controller
{
// GET: Default
public ActionResult Index()
{
return Download();
}
public FileResult Download()
{
string xmlString = "my test xml data";
string fileName = "test" + ".xml";
return File(Encoding.UTF8.GetBytes(xmlString), "application/xml", fileName);
}
}
PS:我试图使用angularjs代码通过angular服务调用这个api。这是在下载按钮点击时调用的。api控制器代码中的任何示例代码或帮助或建议都会有所帮助。考虑到您正在返回XML,您可以让控制器返回一个 然后,您需要修改
GlobalConfiguration.Configuration.Formatters
返回XML,或将客户端配置为将应用程序设置为application/XML
将服务器配置为通过另一种类型(如JSON)返回XML的一种方法是以下代码:
public XDocument returnXMLFile()
{
var xDoc = XDocument.Load("test.xml");
return xDoc;
}
然后可以通过超链接将该文件作为xml下载
var xml = new System.Net.Http.Formatting.XmlMediaTypeFormatter();
xml.MediaTypeMappings.Add(new QueryStringMapping("format", "xml", "application/xml"));
GlobalConfiguration.Configuration.Formatters.Add(xml);
要定制,请看一下有关使用Angular js下载文件的这些问题
- 下面是一个简单得多的例子:
<a href="[pathToController]/returnxmlfile?format=xml" >Download XML</a>
使用System.Net;
使用System.Net.Http;
使用System.Net.Http.Header;
使用系统文本;
使用System.Web.Http;
命名空间WebApplication1.Controllers
{
公共类值控制器:ApiController
{
//获取:api/值
公共HttpResponseMessage Get()
{
var xmlString=“Some XML”;
var result=Request.CreateResponse(HttpStatusCode.OK);
result.Content=newstringcontent(xmlString,Encoding.UTF8,“application/xml”);
result.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“test.xml”
};
返回结果;
}
}
}
它认为像这样的东西可以达到目的
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Web.Http;
namespace WebApplication1.Controllers
{
public class ValuesController : ApiController
{
// GET: api/Values
public HttpResponseMessage Get()
{
var xmlString = "<xml><name>Some XML</name></xml>";
var result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StringContent(xmlString, Encoding.UTF8, "application/xml");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "test.xml"
};
return result;
}
}
}
我正在尝试从数据库获取数据,构建xml,然后通过angular js单击按钮将xml作为文件下载到本地系统。@Chandana控制器方法的返回类型可以是任何类型,框架将为您构建xml。我非常感谢您的帮助和时间。Jonahan的回答符合我的要求,但你的回答对许多像我一样遇到类似情况的人也很有用。我从数据库中获取数据并动态生成xml文件。我正在尝试下载该xml文件。感谢您的编辑,我将完整的xml作为字符串,我正在尝试下载该xml文件。我没有xml文件。很抱歉,我试图切换到另一台计算机来编辑此文件,他们需要一个草稿功能。我进行了另一次更新,您应该能够在字符串变量中获取xml并立即返回。您使用的是Web API 1还是2?我从一个新项目中测试了它,它在Web API 2
FileProvider
is ASP.NET Core中正常工作
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Web.Http;
namespace WebApplication1.Controllers
{
public class ValuesController : ApiController
{
// GET: api/Values
public HttpResponseMessage Get()
{
var xmlString = "<xml><name>Some XML</name></xml>";
var result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StringContent(xmlString, Encoding.UTF8, "application/xml");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "test.xml"
};
return result;
}
}
}
public HttpResponseMessage Get(string fileName)
{
FileStream fileStream = FileProvider.Open(fileName);
var response = new HttpResponseMessage();
response.Content = new StreamContent(fileStream);
response.Content.Headers.ContentDisposition
= new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType
= new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentLength
= FileProvider.GetLength(fileName);
return response;
}