WebResponse 跨域访问

本文探讨了在ASP.NET环境中实现跨域访问的技术,包括使用XMLHttpRequest的局限性及解决方法,以及如何利用WebResponse进行跨域访问,并提供了相关的C#代码示例。文章深入分析了跨域访问中需要注意的细节,如GET与POST的区别和Timeout问题。

前两天,一个朋友让我帮他写这样一个程序:在asp.net里面访问asp的页面,把数据提交对方的数据库后,根据返回的值(返回值为:OK或ERROR),如果为OK再把填入本地数据库。当时,想当然,觉得很简单,用js的xmlhttp ,如果根据response 的值是“OK”就执行提交本地数据库。很快写完发过去,让朋友试试,一试发现不行,后来一问,原来是跨域访问,我给忽略了,于是让朋友把asp改成web service,可朋友说程序是合作公司做的,只会asp,不会用web service ,狂晕ing。没办法,只能请出asp.netWebResponse了,很多网站采集程序都是用这个。第一版写完了,倒是可以跨域访问了,不过是乱码,调整有关编码的方式,终于可以了。这个应用虽小可是涉及的知识点不少:
1、xmlhttp 不能跨域提交。
当然XMLHttpRequest还是权宜的解决的方法,可以参考思归写的一篇文章:http://blog.joycode.com/saucer/archive/2006/10/03/84572.aspx

2、webresponse可以进行跨域访问,不过要注意
1)、get和post的区别。
2)、注意Timeout的问题。

这些都是简单的程序,记下来备忘,高手就不必看了。

不废话了,下面是相关的c#代码:


///   <summary>
        
///  使用Post方法发送数据
        
///   </summary>
        
///   <param name=”pi_strPostURl”> 提交地址 </param>
        
///   <param name=”pi_strParm”> 参数 </param>
        
///   <returns></returns>        
         public   static   string  PostResponse( string  pi_strPostURl,  string  pi_strParm)
        {
            
try
            {
                
// 编码
                Encoding t_Encoding  =  Encoding.GetEncoding(“GB2312“); 
        Uri t_Uri 
=   new  Uri(pi_strPostURl);              
                
byte [] paramBytes  =  t_Encoding.GetBytes(pi_strParm);
                WebRequest t_WebRequest 
=  WebRequest.Create(t_Uri);
        t_WebRequest.Timeout 
=   100000 ;
                
// 设置ContentType
                t_WebRequest.ContentType  =  “application / x - www - form - urlencoded“;
                
                t_WebRequest.Method 
=  EnumMethod.POST.ToString();                 // 初始化
                 using  (Stream t_REStream  =  t_WebRequest.GetRequestStream())
                {
                    
// 发送数据
                    requestStream.Write(paramBytes,  0
, paramBytes.Length);
                }
                
                WebResponse t_WebResponse 
=
 t_WebRequest.GetResponse();
                
                
using  (StreamReader t_StreamReader  =   new  StreamReader(t_WebResponse .GetResponseStream(), t_Encoding))
                {
                    
return  t_StreamReader.ReadToEnd();
                }
            }
            
catch
            {
                
return  “ERROR“;
            }
        }
 
public   static   string  GetResponse( string  pi_strPostURl,  string  pi_strParm)
        {
            
try
            {
                
// 编码
                Encoding t_Encoding  =  Encoding.GetEncoding(“GB2312“);               
                Uri t_Uri 
=   new  Uri( string .Format(“{ 0 } ? { 1 }“, pi_strPostURl, pi_strParm));
                
                WebRequest t_WebRequest 
=
 WebRequest.Create(t_Uri);
               
                t_WebRequest.Timeout 
=   100000 ;
                t_WebRequest.ContentType 
=  “application / x - www - form - urlencoded“;
               
                t_WebRequest.Method 
=  EnumMethod.GET.ToString();  
                WebResponse t_WebResponse 
=
 t_WebRequest.GetResponse();
                
                
using  (StreamReader t_StreamReader  =   new  StreamReader(t_WebResponse.GetResponseStream(), t_Encoding))
                {
                    
return  t_StreamReader.ReadToEnd();
                }
            }
            
catch  (Exception e)
            {
                
return  e.ToString();
            }
        }
public   static   string  AtionResponse( string  pi_Url, EnumMethod pi_Method)
        {
             
string  t_strUrlPath = “”;
             
string  t_parm  =  “”;            
             Uri  t_Url 
=   new  Uri(pi_Url);                
             t_parm
=  t_Url.Query;
             
if  (parmString.StartsWith(“ ? “))
                    t_parm 
=  t_parm.Remove( 0 1 );                
             t_strUrlPath 
=  “http: // “ + t_Url .Authority + t_Url .AbsolutePath; 
             return  GetResponse(t_strUrlPath, t_parm, pi_Method);
        }
 
public   enum  EnumMethod
        {
            POST,
            GET
        }
 

本文地址:http://www.watch-life.net/aspnet/webresponse-cross-site-visit.html

<think>嗯,用户的问题是关于Web Services和WebResponse的区别与联系。这需要从技术层级和功能定位两个维度来解析。 用户可能正在学习Web开发或系统集成,需要理清这两个容易混淆的概念。从用户引用的资料来看,ta已经查阅过相关文档,但可能被技术术语困扰。用户真正需要的可能是:1) 概念的本质区别 2) 实际应用中的交互关系 3) 避免常见的理解误区。 先看Web Services:这是完整的服务架构,属于解决方案层。就像用户引用[1]提到的,它通过标准化协议(SOAP/REST)暴露业务功能,实现平台交互。核心特征包括WSDL描述、UDDI注册和XML消息传递。例如订单查询服务,会定义getOrderDetail()这样的端点方法。 而WebResponse.NET框架中的具体类(System.Net.WebResponse),属于通信工具层。它只负责承载HTTP响应数据,比如服务器返回的状态码、头信息和响应流。就像用户引用[2]显示的代码片段,它是SoapHttpClientProtocol底层使用的传输对象。 两者的关联性体现在:当客户端调用Web Service时,必然触发WebResponse的生成。比如用C#调用天气服务: ```csharp var request = WebRequest.Create("http://weather.service/forecast"); using (WebResponse response = request.GetResponse()) { // 这里解析的就是WebService返回的SOAP/JSON数据 } ``` 这里WebResponse就像快递包裹,里面装着Web Service处理后的货物(订单数据/天气信息)。 用户可能存在的认知偏差是:将WebResponse等同于Web Service。需要强调前者只是消息载体,后者包含完整的业务逻辑处理链条。就像不能把快递纸箱等同于电商平台。 最后要提醒用户注意技术演进:现代RESTful API中,WebResponse可能被更高级的HttpResponseMessage替代,但基础原理不变。</think>好的,我们来清晰地区分和联系 Web Services 和 WebResponse。 **核心区别:层级与范畴** 1. **Web Services (Web服务):** * **层级:** 应用层 / 服务层。 * **范畴:** 一种完整的、标准化的**软件系统架构**或**技术方案**。 * **目的:** 提供一种**平台、语言**的方式,让不同的应用程序或系统通过网络(通常是互联网)进行**互操作和数据交换**。 * **关键特性:** * **基于标准协议:** 主要使用 SOAP (基于 XML) 或 REST (通常基于 HTTP,使用 JSON/XML) 等协议。 * **暴露功能:** 将特定的业务功能(如查询数据、处理订单、计算等)封装成可远程调用的服务接口。 * **平台无关性:** 服务提供者和消费者可以使用不同的编程语言和操作系统。 * **松耦合:** 服务提供者和消费者之间依赖接口定义(如 WSDL for SOAP, OpenAPI for REST),而非具体实现。 * **运作方式 (如引用[1]所述):** * 客户端发送请求(HTTP 请求,包含 SOAP 消息或 REST 调用参数)。 * 服务器端 Web 服务接收请求,解析内容,**调用内部业务逻辑处理**。 * 服务器端 Web 服务将处理结果**封装**成标准格式(XML/JSON)。 * 服务器端 Web 服务**生成一个包含结果的 HTTP 响应**,发送回客户端。 * **类比:** Web Service 就像一个**提供特定服务的远程店铺**(例如:计算税费、查询库存、翻译文本)。它有明确的地址、服务目录(接口定义)和处理请求的能力。 2. **WebResponse (对象):** * **层级:** 网络通信层 / 协议实现层。 * **范畴:** 一个**具体的编程对象**(特别是在 .NET Framework/ Core 中),代表一次 HTTP 请求后**服务器返回的响应**。 * **目的:** 在客户端代码中,提供对 HTTP 响应状态、头部信息和响应体内容的**访问和操作**。 * **关键特性:** * **封装响应:** 包含 HTTP 状态码(如 200 OK, 404 Not Found, 500 Internal Server Error)、响应头(如 Content-Type, Content-Length)以及最重要的——**响应体内容流**(Stream)。 * **数据载体:** 响应体流中承载的正是服务器发回的实际数据。对于 Web Service 调用,这个流里就是 SOAP XML 响应或 REST 的 JSON/XML 数据。 * **客户端使用:** 开发者使用 `WebResponse` 对象(或其派生类如 `HttpWebResponse`)来检查请求是否成功(状态码),读取响应头信息,并**从响应流中读取和解析服务器返回的数据**。 * **运作方式:** * 当客户端应用程序(可能是调用 Web Service 的客户端,也可能是任何发出 HTTP 请求的程序)向服务器发出一个 HTTP 请求(通常通过 `WebRequest` 或其派生类如 `HttpWebRequest`)后。 * 服务器处理请求并发送回 HTTP 响应。 * 在客户端代码中,通过调用 `WebRequest.GetResponse()` 或类似方法,会得到一个 `WebResponse`(或 `HttpWebResponse`)对象实例。 * 开发者使用这个对象来访问响应的详细信息。 * **类比:** `WebResponse` 就像从那个远程店铺**寄回来的包裹**。包裹本身(`WebResponse` 对象)包含了寄送状态(状态码)、包裹说明(响应头),以及包裹里的实际货物(响应流中的数据)。 **核心联系:调用 Web Service 时 WebResponse 的作用** * **当客户端调用一个 Web Service 时,`WebResponse` 是客户端获取 Web Service 调用结果的必备机制和载体。** * **过程详解:** 1. **客户端构建请求:** 客户端代码构造一个对 Web Service 端点的 HTTP 请求(`WebRequest`/`HttpWebRequest`)。对于 SOAP,请求体是 SOAP XML 信封;对于 REST,请求包含 URL、方法(GET/POST/PUT/DELETE)和可能的参数/负载。 2. **发送请求:** 客户端通过网络发送这个请求。 3. **服务端处理:** Web Service 接收请求,执行其封装的业务逻辑(如查询数据库、进行计算)。 4. **服务端构建响应:** Web Service 将处理结果**封装**成约定的格式(SOAP XML 或 REST JSON/XML),并**设置好 HTTP 状态码和响应头**(如 `Content-Type: application/soap+xml` 或 `Content-Type: application/json`)。 5. **服务端发送响应:** Web Service 服务器通过 HTTP 协议将这个包含状态、头部和响应体的数据包发送回客户端。 6. **客户端接收响应:** 在客户端代码中,调用 `GetResponse()` 方法会**阻塞等待**(或异步处理)这个来自服务器的 HTTP 响应。 7. **客户端获取 WebResponse 对象:** 一旦响应到达,`GetResponse()` 方法**返回一个 `WebResponse`(通常是 `HttpWebResponse`)对象**。 8. **客户端处理响应:** 客户端代码使用这个 `WebResponse` 对象: * 检查 `.StatusCode` 属性判断请求是否成功(如 200)。 * 检查 `.Headers` 集合获取响应头信息(如 `Content-Type`)。 * 通过 `.GetResponseStream()` 方法**获取一个 Stream 对象**,该流包含了服务器发回的**原始响应体数据**(即 SOAP XML 或 REST JSON/XML)。 * 客户端代码**读取这个流,并根据 `Content-Type` 等信息,将流中的原始数据反序列化(解析)** 成客户端代码可以理解的本地对象(如 .NET 类实例)。对于 SOAP,这通常由 WSDL 生成的代理类自动完成;对于 REST,需要手动或使用库(如 `Newtonsoft.Json` / `System.Text.Json`)进行反序列化。 9. **获得结果:** 解析后的数据就是 Web Service 调用的**最终业务结果**。 **总结区别与联系** | 特性 | Web Services (Web服务) | WebResponse (对象) | 联系 | | :----------- | :---------------------------------------------------- | :----------------------------------------------------- | :--------------------------------------------------------------------------------------------------- | | **本质** | **软件架构/技术方案**,用于平台互操作 | **编程对象** (.NET),代表一个HTTP响应 | Web Service 是**服务提供者**,WebResponse 是客户端**获取服务结果的工具/容器**。 | | **层级** | **应用层/服务层** (定义业务功能接口和交互协议) | **网络通信层** (处理HTTP协议响应细节) | 调用 Web Service **必然**涉及在客户端创建和处理 WebResponse 对象来接收响应。 | | **主要功能** | **暴露和实现**可远程调用的业务功能 | **封装和提供访问** HTTP 响应的状态、头部和**内容流** | Web Service 的处理结果**作为内容流被封装在 WebResponse 对象中**返回给客户端。 | | **使用场景** | 构建分布式系统、系统集成、API 提供 | **任何**发出 HTTP 请求并需要处理响应的 .NET 客户端程序 | 调用 Web Service 是 WebResponse **最常见和重要的应用场景之一**。 | | **内容** | 业务逻辑、接口定义 (WSDL/OpenAPI)、数据格式 (XML/JSON) | HTTP 状态码、响应头、包含原始响应数据 (XML/JSON) 的流 | WebResponse 中的**响应流承载了 Web Service 调用的具体业务数据**(SOAP Envelope 或 REST Payload)。 | | **类比** | **提供服务的远程店铺** | **从店铺寄回的包裹** (含状态单、说明单和货物) | 要得到店铺(Web Service)的服务结果,必须接收并打开包裹(WebResponse)才能拿到里面的货物(业务数据)。 | **简单来说:** * **Web Service** 是你想要调用的那个远程功能。 * **WebResponse** 是你调用那个功能后,服务器给你“寄”回来的那个“包裹”,里面装着功能执行的结果(成功的数据或错误信息)。你需要打开这个包裹(使用 `WebResponse` 对象)才能知道结果是什么。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值