.net中http接口相关

本文介绍了如何在.NET中通过HTTP接口进行数据传输,特别是利用HTTPHelper实现页面POST数据并跳转。在发送方,通过修改POSTForm方法实现新窗口跳转。在接收方,不论是ASPX页面还是API,都能处理请求。遇到图片数据丢失的问题,原来是由于多余的解密操作,通过URL编码解决了这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近要写接口,其中有一个要使用页面去接受数据,想了想怎么处理,想到一个方案。

要求是点击按钮向一个aspx页面post数据并且打开这个页面并显示post来的数据,于是搜索到了一个解决方案

首先在发起跳转和传数据的页面做手脚,搜索到了一个文章,介绍到了一个httphelper,文章链接:http://www.cnblogs.com/gb2013/p/aspnet_post_and_redirect.html

于是用这个成功实现了跳转,但是是当前页面,而不是新开的一个新的页面窗口,于是看这个类里面的PreparePOSTForm方法,然后做了改动,将form加了个target="_blank",于是实现了跳转新打开页面并post数据,该类方法不做解释,看类代码就懂了。


在接收数据的页面,也就是目标aspx页面写了处理请求的方法

pageload代码:

if (!Page.IsPostBack)
{
      ProcessRequest();
}
ProcessRequest方法:

// 获取所有的请求信息
            string A= Request["A"].ToString();
            string B= Request["B"].ToString();
            string C= Request["C"].ToString();
            string D= Request["D"].ToString();
            string E= Request["E"].ToString();

            // 先进行验证
            string VE= FormsAuthentication.HashPasswordForStoringInConfigFile(A+ B+ C+ D+ E, "MD5");

            // 进行判断是不是对的,有没有丢数据
            if (VE== E)
            {
                // 相等,则可以进行正常操作
                // 前台页面的数据绑定等相关操作写在这里
            }
            else
            {
                // 不相等,有数据丢失,要求重新发送请求
                // 进行数据丢失处理
            }

以上方法没有涉及json序列化和加密等相关内容,仅有一个校验数据的过程,若有json和其他加密方式则可以获取请求的数据流进行解析即可。

另,该方法没有返回数据,仅限对方发来请求,接收方处理,但不返回数据或者数据返回需要以请求形式返回,这个是由于httphelper那个方法是提交形式发来的数据,如果需要直接返回则应当使用一般处理程序等其他方法。


将数据处理完成之后返回给发送方

// 初始化
            Uri uri = new Uri("http://localhost:888/abc.aspx");// 目标地址
            HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
            request.Method = "POST";
            Encoding encoding = Encoding.GetEncoding("utf-8");

            // 开始组装请求数据
            string A= "a";
            string B = "b";
            string C= "c";
            string D= "d";
            string E= FormsAuthentication.HashPasswordForStoringInConfigFile(A+ B+ C+ D+ "A", "MD5");
            // 把这些数据组装成请求
            string postData = ""; // 组装要返回的数据,如果json需要将这个在序列化一下

            byte[] byteData = encoding.GetBytes(postData);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteData.Length;
            try
            {
                using (Stream postStream = request.GetRequestStream())
                {
                    // 发送数据,如果没有后面被注释掉的部分,请求会在这个方法执行完成之后再发送
                    postStream.Write(byteData, 0, byteData.Length);
                }
                //try
                //{
                //    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                //    {
                //        StreamReader reader = new StreamReader(response.GetResponseStream());
                //        string responseStr = reader.ReadToEnd();	// 同理,如果是经过了序列化的流需要在这里进行反序列化等相关操作
                //        if (responseStr != null && responseStr.Length > 0)	// 返回的数据处理
                //        {
                //            // 完成
                //        }
                //        else
                //        {
                //            // 失败
                //        }
                //    }
                //}
                //catch (WebException ee)
                //{
                //    string error = ee.Message;
                //}
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }
以上就实现了网络接口,仅仅是最基本功能,不包括序列化和加密等操作。


如果接受的是一般处理程序,代码也基本相同,仅仅是返回的时候进行的处理,

返回部分代码如下:

// 返回处理结果
                context.Response.ContentType = "application/x-www-form-urlencoded";
                context.Response.Write(postData);
该段代码仅仅是返回结果的类型处理,其中postData是经过处理的数据,类型与Write方法相符就行,Write方法有4个重载,支持的类型,有:char c, object obj, string s 和 char[] buffer,int index,int count,使用参考文档。


.net MVC里面使用的是controller进行这个操作,里面的实现方式相同。但是controller可以直接返回数据,将控制器的方法的返回类型改一下然后返回就好。





更新————————

今天用接口传图片的时候,双方使用base64串进行传输,传输过程中发现图片数据丢失,于是各种找问题,最后发现是传输过程中对base64进行了解密,导致的数据丢失,接收数据方那边是直接多进行了一次解密,于是发送方进行了URLEncode,于是该问题解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值