C#连JAVA的有安全信息头(soap)webservice问题 ?100分webservice带消息头的请求写法
本帖最后由 tys101582 于 2012-08-11 10:45:28 编辑 最近对方提供了一个接口文档给我,没链过这样的有安全信息头的服务,请高手帮忙指点一下怎么写,好吗?
接口说明如下:
按SGIP协议进行通讯;
1.3接口规范
测试接口地址配置文件
http://192.168.0.168/services/SMSSendTask?wsdl
信息进行安全认证:
webservice的头域认证,head里面包括如下几个字段
名称类型备注
sequenceint范围从0到Int的上限,然后尾追回0,周而复始。Sequence每次发送后必须自增,如果系统发现当前已发送的sequence大于请求的sequence,系统认为此媒体信息非法(只有当SP的安全认证为高时才验证sequence)
spidString短信平台分配的SPID
timestampString格式yyyyMMddHHmmss(14位,24小时制),时间戳必须是当前时间的则系统认为媒体信息非法
keyString格式 sequence+spid+password+ timestamp的MD5加密字符串。这里的password也是平台分配的密钥
modeint默认填写0
infoString暂时为空
1.3.1短信下行接口
函数功能
该接口用于SP提交短信下发任务。
函数说明
MediaResultBean[] sendMediaTask(ExtMediaTaskBean[] extMediaTasks)
参数说明:
参数如何理解
extMediaTasks媒体消息数组
MediaResultBean说明:
参数如何理解类型
index为0的时候才是处理成功,其他都是失败int
mediaTaskID获取状态报告的ID,为0时没有是不需要状态报告String
resultNo只有返回10000是才是正确,其他的都是失败String
ExtMediaTaskBean说明:
参数如何理解类型必填
sendNo发送方(默认为114)StringY
receiverInfo接收方StringN
content发送内容StringY
subject主题StringY
staffNo提交人工号StringN
sendTime发送时间 格式为:(yyyy-MM-dd HH:mm:ss)DateN
priority优先级
1008001:低
1008002:中
1008003:高StringY
spIdSPIDStringY
接口调用说明
接口调用时,会对SP的信息进行安全认证。
我在C#中引用了这个服务,但是不知在方法前如何加这个信息安全头head,请高手指点,对方也不提供DEMO,唉。
void fun1()
{
sms_sp.Web_SmsSP.SMSSendTask smsst = new sms_sp.Web_SmsSP.SMSSendTask();
sms_sp.Web_SmsSP.ExtMediaTaskBean[] emtb_arr = new sms_sp.Web_SmsSP.ExtMediaTaskBean[3];
emtb_arr[0] = new sms_sp.Web_SmsSP.ExtMediaTaskBean();
//emtb_arr[0].sendTime = ....;
//....
emtb_arr[1] = new sms_sp.Web_SmsSP.ExtMediaTaskBean();
//emtb_arr[1].sendTime = ....;
//....;
emtb_arr[2] = new sms_sp.Web_SmsSP.ExtMediaTaskBean();
//emtb_arr[2].sendTime = ....;
//....;
smsst.sendMediaTask(emtb_arr);
}
分不够在加!
[解决办法]
用WCF吧,WCF控制消息头很容易,连接webservice也没问题,而你说的c# webservice我没用过,不知道是否方便。
[解决办法]
WEBSERVER为什么要这样设计?假如两个客户端或者以上的查询,就直接报错啊。
[解决办法]
哈哈,终于有人遇到和我一样的问题了。我的一个项目使用c#开发,客户那里原来的厂商给他的webservice是个xfire的服务,因为对方使用的header验证,底层的东西实在搞不明白。我找了好多办法都没有办法加上header,最后一招是用java开发了一个命令行程序,用C#调用这个java命令:这个程序接收c#的输入,并包装header后向xfire发送请求并接受服务,再以标准输出返回给C#。
总之,就是再写一个java来包装头和去掉头,返回给c#使用。
[解决办法]
楼上真够累的,SoapHeader的相关介绍也不少,网上找找就有,比如这个:
http://www.cnblogs.com/houleixx/archive/2009/08/22/webservice-soapheader-security.html
[解决办法]
这个文章我看到过,不过C#学的浅看不懂呢。不过现在的处理方式也很稳定。并且因为xfire客户端会多次发送请求给服务,用java包装一下客户端只需要验证一次安全,要是用c#开发客户端,就要发送n多次安全验证。性能倒不如用java包装一下呢、
[解决办法]
信息进行安全认证:
webservice的头域认证,head里面包括如下几个字段
名称类型备注
sequenceint范围从0到Int的上限,然后尾追回0,周而复始。Sequence每次发送后必须自增,如果系统发现当前已发送的sequence大于请求的sequence,系统认为此媒体信息非法(只有当SP的安全认证为高时才验证sequence)
spidString短信平台分配的SPID
timestampString格式yyyyMMddHHmmss(14位,24小时制),时间戳必须是当前时间的则系统认为媒体信息非法
keyString格式 sequence+spid+password+ timestamp的MD5加密字符串。这里的password也是平台分配的密钥
modeint默认填写0
infoString暂时为空
要把这个参数传过去..
[解决办法]
我说楼主,那些c#加soapheader的资料不是没有看过。但是我看都没有几个成功的。虽说webservice本来是标准化的,可是实现起来框架很多,各框架之间都不一定共通,更何况你还要跨语言。人家也不是不会c#,只是c#根本没有办法直接调用哪些java的webservice框架。
你要是会java,把对方给你的demo改一下,打包成命令行的jar,或者改成去掉soapheader的webservice服务,再用c#的process类去调用。
我以前遇到的一个项目就是c#调用xfire的webservice,对方也是soapheader验证,我拿着对方给的java的demo改造了一下,写了个jar程序,这个jar完成这么几个事情:
(1)接受c#的process类调用,并加soapheader包发server请求服务.
(2)从server接收返回,以标准输出方式返回给c#结果。
[解决办法]
你用相同的框架加soapheader很容易,但是框架不同的话即便都是java写的都不容易实现调用,更何况c#.何苦为难自己呢。还是用我的方法吧。