C# 验证对外部REST服务的请求

C# 验证对外部REST服务的请求,c#,asp.net,C#,Asp.net,我对web开发非常陌生,对web的主要概念也不是很了解。然而,我的任务是编写一个asp.net应用程序,用户可以通过查询外部RESTfulWeb服务来搜索文档。对此REST服务的请求必须通过HTTP基本身份验证进行身份验证 到目前为止还不错,我已经能够使用HttpWebRequest和HttpWebResponse查询服务,添加编码用户:pass到请求的授权头,反序列化Json响应,并生成一个字符串列表,其中包含搜索产生的pdf文档的url 因此,现在我以编程方式使用以下URL向页面添加Hype

我对web开发非常陌生,对web的主要概念也不是很了解。然而,我的任务是编写一个asp.net应用程序,用户可以通过查询外部RESTfulWeb服务来搜索文档。对此REST服务的请求必须通过HTTP基本身份验证进行身份验证

到目前为止还不错,我已经能够使用
HttpWebRequest
HttpWebResponse
查询服务,添加编码用户:pass到请求的授权头,反序列化Json响应,并生成一个字符串列表,其中包含搜索产生的pdf文档的url

因此,现在我以编程方式使用以下URL向页面添加
HyperLink
元素:

foreach (string url in urls) {

    HyperLink link = new HyperLink();
    link.Text = url;
    link.NavigateUrl = url;
    Page.Controls.Add(link);

}
问题是,对这些文档的请求必须使用相同的基本http身份验证和相同的用户进行授权:在查询REST服务时通过,因为我只是创建供用户单击的链接,而不是创建任何
HttpWebRequest
对象,我不知道如何验证由于用户单击链接而产生的请求


非常感谢任何关于我如何完成这一任务的建议。提前谢谢

您可能希望像我认为您已经在做的那样,在服务器端执行请求,然后在您自己的页面中显示嵌入的结果,或者直接将结果流式返回给用户

有点不清楚你需要什么(什么是链接,你向用户展示了什么,等等),所以这是我根据你提供的信息所能做的最好建议

更新: 我将创建一个HttpHandler(ASP.NET项目中的一个.ashx文件),并使用参数链接到该文件,这样您就可以向REST服务发出请求并获得正确的文件,然后将数据流直接返回给访问者。下面是一个简单的例子:

public class DocumentHandler : IHttpHandler {

    public Boolean IsReusable {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context) {
        // TODO: Get URL of the document somehow for the REST request
        // context.Request
        // TODO: Make request to REST service

        // Some pseudo-code for you:
        context.Response.ContentType = "application/pdf";

        Byte[] buffer = new WebClient().DownloadData(url);
        context.Response.OutputStream.Write(buffer, 0, buffer.Length);

        context.Response.End();
    }
}

我希望您可以自己填写这些空白。

用户在单击链接时必须进行身份验证,浏览器应弹出用户名和密码框。非常感谢您的回复,很抱歉不清楚。通过查询REST服务,我能够生成一个字符串列表,其中包含指向文档的url。因此,当用户搜索指定日期的发票类型的文档时,我可以将当天的发票作为标准元素显示给他。但是你的建议似乎是合乎逻辑的,关于如何将html/pdf从响应对象直接流回到用户的任何建议?我给出的示例向你展示了一种获取数据的方法(使用WebClient类和流直接发送给用户。您可能需要使用另一个类,但不确定远程服务对身份验证有什么要求。如果这回答了您的问题,请将其标记为答复:)再次感谢,它确实帮助了我的努力!但由于overflowexception,我无法使用缓冲区,因此我必须将httpwebresponse responsestream直接复制到Response.outputsteram,而不使用缓冲区。此外,尽管我想尝试,但我没有创建处理程序。这样做的好处是什么?我想标记答案可以接受,但也许我应该等到有机会实现httphandler之后?