国庆长假到了,本想出去玩玩,无奈自己屌丝一枚,啥都没有,只能自己宅在家里思考思考人生。不过人生还是过于复杂,一时间也想不出个所以然,只能是整理一下在工作中遇到的一些小问题,首先是关于带soapheader的webservice。

一、webservice大家都用的比较频繁,有时也有一些带soapheader的webservice,首先一种最简单的调用soapheader的情况就是,如果对方的webservice也是用.net写的,可能会是这种方式

     [WebMethod]
[SoapHeader("Header")]
public string HelloWorld()
{
if (Header.username == "admin" && Header.password == "")
{
return "Hello World";
}
else
{
throw new Exception("验证失败");
}
} public class AuthHeader : SoapHeader
{
public string username;
public string password;
}

之后我们在通过添加服务引用或者是利用vs的wsdl工具生成代理类,都会把上面的AuthHeader类型给生成好,我们要做的就是简单的赋值工作了

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//要调用的webservice的类型,自动生成在代理类中
SoapHeaderTest soapTest = new SoapHeaderTest();
//要调用的soapheader的类型,自动生成在代理类中
AuthHeader authHeader = new AuthHeader();
authHeader.username = "admin";
authHeader.password = "";
soapTest.AuthHeaderValue = authHeader;
string content = soapTest.HelloWorld();
context.Response.Write(content);
}

通过这种方式就可以通过验证调用webservice获取返回信息了。

二、有些时候我们发现我们调用对方的webservice一直失败,然后添加的服务引用或者是代理类中也没有soapheader的类型,然后客户告诉我们,你要调用接口必须传soapHeader,这个soapHeader在.net中是这样的

    [DataContract(Namespace = "http://xxx.xxx.xxxxx")]
public class AuthHeader
{
public string username { get; set; }
public string password { get; set; }
}

我们把这个AuthHeader按照上面的格式写好。然后在调用webservice中的方法之前加上我们的soapheader,代码如下:

        //添加服务引用生成的类型
SoapTestService.SoapHeaderTestSoapClient client = new SoapTestService.SoapHeaderTestSoapClient();
//客户告诉我们AuthHeader的类型,然后自己在程序中对应写出来
AuthHeader header = new AuthHeader();
header.username = "admin";
header.password = "";
//开始加入监控头信息
AddressHeader soapheader = AddressHeader.CreateAddressHeader("AuthHeader", // Header Name
"http:xxx.xxx.xxxxx",//地址头的命名空间
header);//传人的AuthHeader
EndpointAddressBuilder eab = new EndpointAddressBuilder(client.Endpoint.Address);
eab.Headers.Add(soapheader);//将地址头加入进去
client.Endpoint.Address = eab.ToEndpointAddress();
//结束加入监控头信息

之后在调用webservice的方法就可以成功调用并获取返回内容了。

三、最后一种情况就是人家只告诉你需要加一个这样的

<AuthHeader>

<username>用户名</username>

<password>密码</password>

</AuthHeader>

这个时候就需要使用我们的SoapUI了,我们来用soapui看看我们报文吧

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
<soap:Header/>
<soap:Body>
<tem:HelloWorld/>
</soap:Body>
</soap:Envelope>

发现怎么<soap:Header/>中是空的呢,然后我们按照别人给的格式将soapheader中填上

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
<soap:Header>
<AuthHeader>
<username>admin</username>
<password>123</password>
</AuthHeader>
</soap:Header>
<soap:Body>
<tem:HelloWorld/>
</soap:Body>
</soap:Envelope>

然后这样发送过去,发现webservice成功访问并且接收到返回值了,哎,任务时间比较紧迫,只能用最简单也是最笨的方法了,替换数据然后在把报文发过去

 string url = ConfigurationManager.AppSettings["url地址"].ToString();

                var webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url));
string UserName = ConfigurationManager.AppSettings["用户名"].ToString();
string Password = ConfigurationManager.AppSettings["密码"].ToString();
webRequest.PreAuthenticate = true;
NetworkCredential networkCredential = new NetworkCredential(UserName, Password);
webRequest.Credentials = networkCredential;
byte[] bs = Encoding.UTF8.GetBytes(SoapXml);
webRequest.Method = "POST";
webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
webRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
webRequest.ContentLength = bs.Length;
using (Stream reqStream = webRequest.GetRequestStream())
{
reqStream.Write(bs, , bs.Length);
}
//reqStream.Close(); WebResponse myWebResponse = webRequest.GetResponse();
string result;
using (StreamReader sr = new StreamReader(myWebResponse.GetResponseStream(), Encoding.GetEncoding("UTF-8")))
{
// 返回结果
result = sr.ReadToEnd();
}

最终返回的xml中的内容也只能是自己解析了。。。

可能遇到后面两种情况的会少一些,希望大家有其他的方式可以分享一下。最后祝大家国庆节快乐!

.net 在不同情况下调用带soapheader的webservice的方式的更多相关文章

  1. 什么情况下调用doGet()和doPost()?

    默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法: 为get的时候,调用deGet()方法.

  2. 某些情况下调用函数为什么要在函数名前加“(void)”

    我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...

  3. 什么情况下调用doGet()和doPost()?

    Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost().

  4. Django在不启动server的情况下调用方法

    from django.conf import settingsfrom django import template settings.configure() a = template.Templa ...

  5. layoutSubviews在什么情况下调用

    可以使用layoutSubviews修改UI: 1.init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会 ...

  6. C#/PHP调用有SoapHeader的WebService

    日前调用第三方WebService接口时遇到了SoapHeader验证的问题,记录一下解决方法. 接口需要的格式: <soapenv:Header> <ReqSOAPHeader x ...

  7. Ajax在调用含有SoapHeader的webservice方法

    ·         [WebService(Namespace = "http://tempuri.org/")] ·             [WebServiceBinding ...

  8. asp.net 调用带证书的webservice解决办法

    最近在朋友弄一个调整省政府政务工作流的程序.. 需要把当前的信息推送到政务网上,采用的是带证书的https webservice.. 下面说一下实现过程 第一步,引用webservice地址,删除we ...

  9. x86 x64下调用约定浅析

    x86平台下调用约定 我们都知道x86平台下常用的有三种调用约定,__cdecl.__stdcall.__fastcall.我们分别对这三种调用约定进行分析. __cdecl __cdecl是C/C+ ...

随机推荐

  1. ACM1994

    /* Problem Description 为自行解决学费,chx勤工俭学收入10000元以1年定期存入银行,年利率为3.7% .利率按年计算,表示100元存1年的利息为3.7元.实际上有时提前有时 ...

  2. eclipse 使用gradle构建系统时候报错

    今天启动eclipse后,昨天运行正常的gradle项目报错,无法进行编译,错误信息如下: Unable to start the daemon process. This problem might ...

  3. android中向bitmap里写入文字

    public static Bitmap drawText2Bitmap(String text, int imgResourceId, Context mContext) { try { Resou ...

  4. cmake编译win下64位obs

    obs是一款开源编码推流工具,简单易用,非常流行.一次项目中,发现本台式机I3处理器下32位obs推流CPU使用率100%.而使用的第三方设备在64位下,性能较好.所以需要编译64位obs并且编译相应 ...

  5. HDU 5783 Divide the Sequence (贪心)

    Divide the Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5783 Description Alice has a seq ...

  6. CodeForces 489C Given Length and Sum of Digits... (贪心)

    Given Length and Sum of Digits... 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/F Descr ...

  7. (转)UML实践----用例图、类图、对象图、顺序图、协作图、状态图、活动图、组件图、配置图

    面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目的是展示出UML ...

  8. flask中的request.form对象方法

    'add','clear','copy','deepcopy','fromkeys','get','gtlist','has_key','items','iteritems','iterkeys',' ...

  9. HTTP协议状态码详解

    HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJAX,REST,网络爬虫, ...

  10. UVaLive 7267 Mysterious Antiques in Sackler Museum (if-else,枚举)

    题意:给定四个矩形,要求从中选出三个,能不能拼成一个矩形. 析:说到这个题,我还坑了队友一次,读题读错了,我直接看的样例,以为是四个能不能组成,然后我们三个就拼命想有什么简便方法,后来没办法了,直接暴 ...