SMS发送短信设置HttpWebRequest

抓包工具 : fiddlersetup

public static string SendSMS(string url, string context)

{

string postData = context;

System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();

Byte[] contextBytes = encoding.GetBytes(postData);

System.IO.Stream receiveStream = null;

WebResponse webResponse = null;

string responseXml;

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);

webRequest.ContentType = "application/json";

webRequest.ContentLength = contextBytes.Length;

webRequest.Accept = "application/json";

webRequest.ServicePoint.Expect100Continue = false;   //

//if (Configurations.HTTP_ISPROXY.ToUpper() == "TRUE")

//{

//    webRequest.Proxy = new WebProxy(Configurations.HTTP_HOST, Convert.ToInt32(Configurations.HTTP_PORT));

//    webRequest.Proxy.Credentials = new NetworkCredential(Configurations.HTTP_USERNAME, Configurations.HTTP_USERPWD);

//}

//post request

webRequest.Method = "POST";

using (System.IO.Stream requestStream = webRequest.GetRequestStream())

{

requestStream.Write(contextBytes, 0, contextBytes.Length);

}

using (webResponse = webRequest.GetResponse())

{

using (receiveStream = webResponse.GetResponseStream())

{

using (StreamReader sr = new StreamReader(receiveStream, encoding))

{

responseXml = sr.ReadToEnd();

}

}

}

return responseXml;

}

参照 http://blog.csdn.net/kufeiyun/article/details/24112487

博客转载自 http://www.cnblogs.com/cxd4321/archive/2012/01/30/2331621.html

Expect:100-Continue & HTTP 417 Expectation

背景:今天调试火车票查询的代码,发现一个奇怪的事情,如果使用公司本地的代理,那么一切正常,如果使用的是公司台湾的代理,那么将出现以下错误:“The remote server returned an error.(417) Unkown”。很是奇怪啊,为什么换了服务器后,效果完全相反。反复查阅代码最终找出关键点,HTTP协议。

1.分析bug的原因

看着VS2010的错误信息:(417) Unkown。有一点经验的人就会联想到HTTP200啊,等等之类的东西。那个HTTP协议中的内容那么多,到时是哪一个属性出现的问题呢,我决定用wireshark抓包,进行比较。对比结果:用台湾代理时,抓包的结果中多处了一下字符串“?Expect:100-Continue”。(wireshark使用

于是查看关于HTTP1.1的相关网页。HTTP1.1协议中文版-RFC2616HTTP1.1协议英文版-RFC2616

在上两篇文章中可以看到以下一段描述:

The purpose of the 100 (Continue) status (see section 10.1.1) is to allow a client that is sending a request message with a request body to determine if the origin server is willing to accept the request (based on the request headers) before the client sends the request body. In some cases, it might either be inappropriate or highly inefficient for the client to send the body if the server will reject the message without looking at the body.

(100状态码(继续,见10.1.1节)的目的在于允许客户端判定服务器是否愿意接受客户端发来的消息主体(基于请求头域)在客户端发送此请求消息主体前。 在有些情况下,如果服务器拒绝查看消息主体,这时客户端发送消息主体是不合适的或会降低效率。)

就是说 ?Expect:100-Continue的作用是,设定Client 和 Server在Post数据前需要进行 ?“请求头域” 的数据匹配,相当于是握手。如果匹配则开始进行body 的内容,Post数据。否则,报错(417) Unkown

说道这里看似原因已经找到。别急,再仔细看看RFC2616,里面有这样一段话:

Requirements for HTTP/1.1 proxies:

- If a proxy receives a request that includes an Expect request- header field with the "100-continue" expectation, and the proxy either knows that the next-hop server complies with HTTP/1.1 or higher, or does not know the HTTP version of the next-hop server, it MUST forward the request, including the Expect header field. - If the proxy knows that the version of the next-hop server is HTTP/1.0 or lower, it MUST NOT forward the request, and it MUST respond with a 417 (Expectation Failed) status. - Proxies SHOULD maintain a cache recording the HTTP version numbers received from recently-referenced next-hop servers. - A proxy MUST NOT forward a 100 (Continue) response if the request message was received from an HTTP/1.0 (or earlier) client and did not include an Expect request-header field with the "100-continue" expectation. This requirement overrides the general rule for forwarding of 1xx responses (see section ”

(?对HTTP/1.1代理服务器的要求: --- 若代理服务器接到一个请求,此请求包含值为"100-continue"的Expect请求头域,并且代理服务器可能知道下一站点的服务器遵循HTTP/1.1或更高版协议,或者不知道下一站点服务器的HTTP版本,那么它必须包含此Expect头域来转发此请求。 --- 若代理服务器知道下一站点服务器版本是HTTP/1.0或更低,则它不能转发此请求,并且它必须以417(期望失败)状态响应。 --- 代理服务器应当维护一个缓存,以记录最近访问下一站点服务器的HTTP版本号。 --- 若接收到的请求来自于版本是HTTP/1.0(或更低)的客户端,并且此请求不含值为"100-continue"的Expect请求头域,那么代理服务器不能转发100(继续)响应。)

由于我们使用的是代理服务器,那个还有一种原因不能忽略,就是如果目标网页的HTTP的版本号为1.0或之前的版本,而代理服务器的本版为1.1或以上。这么这是,代理服务器将不会转发我们的Post请求,并报错?(417) Unkown

再看wireshark的包信息,其中明确可以看出,协议的版本号为HTTP1.1。这样,我们基本上可以确定?(417) Unkown的原因:

握手失败,请求头域类型不匹配。

2. 请求头域

问题一个接一个,在看看什么是上一节中提到的请求头域,点这里。在该文中有详细的介绍,我就不班门弄斧了。

3.解决方法

可以手动的设置config

<configuration>

<system.net>

<settings>

<servicePointManager expect100Continue="false" />

</settings>

</system.net>

</configuration>

详情见 MSDN主要讲的是,手动设置Expect的值为false,即不进行握手,而直接Post数据。

4. 进一步分析

在C#中的HttpWebRequest 类可以设置请求头域的相关值。如Expect属性就是设置请求头域中Expect的值。但是你可以测试发现,怎么修改都无法控制Client 和 Server是否进行握手。原因在哪呢?问题虽然解决了,但是新的又来了。为什么?求高手赐教。

时间: 2024-07-28 19:43:18

SMS发送短信设置HttpWebRequest的相关文章

java 短信猫发送短信的方法

用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: ·                 1. 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送短信,适用于大型的通信公司. ·                 2. 借助像GSM MODEM之类的设备(支持AT指令的手机也行),通过数据线连接电脑来发送短信,这种方法比较适用于小公司及个人.要实现这种方式必须理解串口通信.AT指令.短信编码.解码. ·                 3. 借

安卓学习之接收、发送短信

短信接收 android中当手机接收到一条短信后,会发送android.provider.Telephony.SMS_RECEIVED 的广播,这条广播中携带有与短信相关的所有数据.每个应用程序都可以在广播接收器里对他监听. 简单的短信接收程序: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main

phoneGap的Android下编写phonegap 发送短信插件

一.前端代码的编写 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>jQuery Mobile Web 应用程序</title> <link href="jquery.mobile-1.3.2.css" rel="stylesheet" type="text/css"/>

Java调用SMSLib发送短信详解

项目中需要用到发送短信功能,之前没做过这方面,找人咨询了一下,也网上查了查,发现并不是很复杂.目前项目已经完成了,做个记录以备后用.程序中发送短信主要有4种方法: 1.向当地的运营商申请网关,不需要额外的设备,利用对方提供的 API调用程序发送短信,适用于大型的通信公司.稳定,速度快,适合短信量特别大的需求,需要连接到运营商的网络中,不适合内网项目. 2.短信猫发送短信,借助像 GSM MODEM之类的设备(支持AT指令的手机也行),通过数据线连接电脑来发送短信,这种方法比较适用于小公司及个人.

C# 通过串口发送短信

手机短信群发作为企业日常通知,公告,天气预报等信息的一个发布平台,在于成本低,操作方便等诸多特点,成为企业通讯之首选.本文介绍短信的编码方式,AT指令以及用C#实现串口通讯的方法. 前言目前,发送短信的方式主要有三种: 1.网关方式:向当前电信部门申请,不需要另外设备.但是费用相对来说,比较高,以目前上海移动公司推出的短信群发套餐来说,对于中小企业的短信息的发送数量来看, 短信群发和打电话相比,几乎没有什么优势.对于几万人的大公司而言,可能很便宜.对于几百人甚至更少人的公司来说,这种方式根本不划

JAVA利用第三方平台发送短信验证码。

前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能. 发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过sessionid判断对应的session,用户输入的验证码再与session记录的验证码进行比较. 为了防止有广告嫌疑

Android之发送短信和接收验证码

最近项目需求需要发送短信和接收验证码并将验证码显示在输入框中 以下是我的记录 前提---权限 <uses-permission android:name="android.permission.SEND_SMS"></uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <

iOS中发送短信/发送邮件的实现 韩俊强的博客

需要引入框架: MessageUI.framework 布局如下: 短信和邮件: #import "ViewController.h" #import <MessageUI/MessageUI.h> @interface ViewController ()<MFMessageComposeViewControllerDelegate,MFMailComposeViewControllerDelegate>//遵循协议 @end @implementation V

java发送短信

最近在做CRM的项目,先接触到的是发送短信.我是通过SMS平台来发送短信的,本人还是菜鸟,如果有说的不对的还望大家给予指正,先谢谢了. 1.先到短信平台去注册用户 2.注册成功后,到接口API下找到UID和KEY,可以进行修改.     GBK编码发送接口地址:    http://gbk.sms.webchinese.cn/?Uid=本站用户名&Key=接口安全密码&smsMob=手机号码&smsText=短信内容     UTF-8编码发送接口地址:    http://utf