【问题标题】:HttpGet return error 405HttpGet 返回错误 405
【发布时间】:2018-06-16 11:31:30
【问题描述】:

使用 ASP Web API,我创建了一个方法,该方法接受一个 ID,然后提供一个 pdf 文件,然后使用 Google 文档查看器或类似服务来查看该文件,

代码看起来像这样,

[HttpGet]
public HttpResponseMessage GetAttachment(string id)
{
    try {
        string mapping = @"\\192.168.3.3\Archieve";
        string sourcedir = @"\Digital\";
        string filename = id + ".pdf";
        string sourceFullPath = mapping + sourcedir + filename;
        byte[] dataBytes = new byte[0];

        // connect to other network using custom credential
        var credential = new NetworkCredential("user", "pass", "192.168.3.3");
        using (new NetworkConnection(mapping, credential)) {
            dataBytes = File.ReadAllBytes(sourceFullPath);
        }

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StreamContent(new MemoryStream(dataBytes));
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentDisposition.FileName = filename;
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

        return response;
    }
    catch (Exception ex) {
        return Request.CreateResponse(HttpStatusCode.Gone, ex.Message);
    }
}

使用此代码,当我在网络浏览器上打开链接时,我可以下载 pdf 文件,但是当我尝试使用 Google 文档查看器显示它时,就像这样

https://docs.google.com/viewerng/viewer?url=http://myserver/webapi/api/File/GetAttachment/0317101532

Google 无法正确显示文件,

当我使用https://www.pdfescape.com/open/ 等其他服务时,错误为The remote server returned an error: (405) Method Not Allowed.

编辑:我认为 Google Docs viewer 和 pdfescape 都需要直接链接到文件,我可以在 Web API 控制器上生成直接链接吗?

【问题讨论】:

  • 删除[HttpGet]后试试
  • 还是一样,在浏览器上打开链接时下载的文件,但在使用谷歌查看器打开时没有
  • 错误的意思是https://www.pdfescape.com/open/不适用于GET动词。您需要阅读 https://www.pdfescape.com/open/ 的文档并了解支持哪些动词,然后使用适当的动词调用该 URL。
  • @ChetanRanpariya,我知道,我认为 google viewer 和 pdfescape 都需要直接链接到文件,我可以在 Web API 控制器上生成直接链接

标签: c# asp.net asp.net-web-api google-document-viewer


【解决方案1】:

尝试将文件复制到本地,然后返回文件链接,类似这样

[HttpGet]
public IHttpActionResult GetAttachment(string id)
{
    try {
        string mapping = @"\\192.168.3.3\Archieve";
        string sourcedir = @"\Digital\";
        string filename = id + ".pdf";
        string sourceFullPath = mapping + sourcedir + filename;
        byte[] dataBytes = new byte[0];

        // connect to other network using custom credential
        var credential = new NetworkCredential("user", "pass", "192.168.3.3");
        using (new NetworkConnection(mapping, credential)) {
            dataBytes = File.ReadAllBytes(sourceFullPath);
        }

        // write file to local
        string destFullPath = string.Format("{0}/Content/Data//{2}", HttpContext.Current.Server.MapPath("~"), filename);
        File.WriteAllBytes(destFullPath, dataBytes);

        // return the file name, 
        return Ok(filename);

        // then you can view your docs using Google Viewer like this
        // https://docs.google.com/viewer?url=http://[YOUR_SERVER_BASE_URL]/content/data/[FILENAME]
    }
    catch (Exception ex) {
        return Content(HttpStatusCode.PreconditionFailed, ex.Message);
    }
}

不要忘记在“内容”文件夹上添加所需的权限

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2015-06-12
    • 2020-05-02
    • 2015-08-31
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多