通过HttpWebRequest调用webService

调用远端接口关键方法如下:

        public object InsertAuditLog(string loginLog)
        {

            //Wsdlxml(loginLog)返回wsdl的xml
            byte[] bs = Encoding.UTF8.GetBytes(Wsdlxml(loginLog));
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://10.109.209.90:21010/gather/services/AioxPort");

            myRequest.Method = "POST";
            myRequest.ContentType = "text/xml; charset=utf-8";
            //mediate为调用方法
            myRequest.Headers.Add("SOAPAction", "http://tempuri.org/mediate");
            myRequest.ContentLength = bs.Length;

            //Console.WriteLine("完成准备工作");
            using (Stream reqStream = myRequest.GetRequestStream())
            {
                reqStream.Write(bs, 0, bs.Length);
            }

            using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse())
            {
                StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                return sr.ReadToEnd();
                //Console.WriteLine("反馈结果" + responseString);
            }
            //Console.WriteLine("完成调用接口");
        }

Wsdlxml(loginLog)方法体如下(自己项目中的,仅参考用):

/// <summary>
        /// 拼装wsdl文件
        /// </summary>
        /// <param name="record"></param>
        /// <returns></returns>
        public string Wsdlxml(string record)
        {
            string wsdl = string.Format(@"
                <?xml version=""1.0"" encoding=""UTF-8""?>
                <definitions
                    xmlns:soap=""http://schemas.xmlsoap.org/wsdl/soap/""
                    xmlns:tns=""http://www.asiainfo.com/web""
                    xmlns:xsd=""http://www.w3.org/2001/XMLSchema""
                    xmlns=""http://schemas.xmlsoap.org/wsdl/""
                    targetNamespace=""http://www.asiainfo.com/web""
                    name=""AioxService"">
                    <types></types>
                    <message name=""requestMessage"">
                        <part name=""textRecord"" type=""xsd:string"">{0}</part>
                        <part name=""reservedItem1"" type=""xsd:string""></part>
                        <part name=""reservedItem2"" type=""xsd:int"">{1}</part>
                    </message>
                    <message name=""responseMessage"">
                        <part name=""result"" type=""xsd:int""></part>
                    </message>
                    <portType name=""AioxPortType"">
                        <operation name=""mediate"" parameterOrder=""textRecord reservedItem1 reservedItem2"">
                            <input message=""tns:requestMessage""></input>
                            <output message=""tns:responseMessage""></output>
                        </operation>
                    </portType>
                    <binding name=""AioxPortBinding"" type=""tns:AioxPortType"">
                        <soap:binding transport=""http://schemas.xmlsoap.org/soap/http"" style=""rpc""></soap:binding>
                        <operation name=""mediate"">
                            <soap:operation soapAction=""mediate""></soap:operation>
                            <input>
                                <soap:body use=""literal"" namespace=""http://www.asiainfo.com/web""></soap:body>
                            </input>
                            <output>
                                <soap:body use=""literal"" namespace=""http://www.asiainfo.com/web""></soap:body>
                            </output>
                        </operation>
                    </binding>
                    <service name=""AioxService"">
                        <port name=""AioxPort"" binding=""tns:AioxPortBinding"">
                            <soap:address location=""http://10.109.209.90:21010/gather/services/AioxPort""></soap:address>
                        </port>
                    </service>
                </definitions>
                ", record, 21010);
            return wsdl;
        }

自己项目中的完整应用代码如下(备忘):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using  System.Data;
using System.Collections;
using System.Xml;
using System.Net;
using System.IO;
using System.Text;

namespace AuditLog
{
    public class AuditLogServer
    {
        /// <summary>
        /// 将计件满足条件日志写入4A
        /// </summary>
        public void WriteAuditLogTo4A()
        {
            DateTime currTime = DateTime.Now;

            #region 处理登录日志
            DataTable loginLogList = GetLoginLog(currTime);
            string loginLog = Generate4ALogXmlForLogin(loginLogList);
            if (!string.IsNullOrEmpty(loginLog))
            {
                //调用写审计接口方法
                try
                {
                    InsertAuditLog(loginLog);
                }
                catch
                { }

                string updateSql = string.Format(@"update CC_LOGIN_HISTORY set tag=1 where LOGIN_TIME + 3 MINUTE > TIMESTAMP(REPLACE(‘{0}‘,‘/‘,‘-‘)) ", currTime);

                ExecuteNonQuery(updateSql);//修改已写入4a登录日志
                //处理模块操作日志
            }

            #endregion

            #region 处理模块操作日志

            string moduleLog = Generate4ALogXmlForModule(GetMoudelLog(currTime));
            if (!string.IsNullOrEmpty(moduleLog))
            {
                //调用写审计接口方法
                try
                {
                    var emd= InsertAuditLog(moduleLog);
                }
                catch { }

                string updateSql2 = string.Format(@"update CC_OPERATION_LOG set tag=1 where LOG_DATE + 3 MINUTE > TIMESTAMP(REPLACE(‘{0}‘,‘/‘,‘-‘)) ", currTime);
                ExecuteNonQuery(updateSql2);//修改已写入4a登录日志
            }

            #endregion
        }

        /// <summary>
        /// 向4a插入审计日志
        /// </summary>
        public object InsertAuditLog(string loginLog)
        {

            byte[] bs = Encoding.UTF8.GetBytes(Wsdlxml(loginLog));
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://10.109.209.90:21010/gather/services/AioxPort");

            myRequest.Method = "POST";
            myRequest.ContentType = "text/xml; charset=utf-8";
            myRequest.Headers.Add("SOAPAction", "http://tempuri.org/mediate");
            myRequest.ContentLength = bs.Length;

            //Console.WriteLine("完成准备工作");
            using (Stream reqStream = myRequest.GetRequestStream())
            {
                reqStream.Write(bs, 0, bs.Length);
            }

            using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse())
            {
                StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                return sr.ReadToEnd();
                //Console.WriteLine("反馈结果" + responseString);
            }
            //Console.WriteLine("完成调用接口");
        }

        #region 生成审计日志内容

        /// <summary>
        /// 生成登录操作日志内容
        /// </summary>
        public string Generate4ALogXmlForLogin(DataTable loginLogList)
        {
            string xml = "";
            if (loginLogList != null && loginLogList.Rows.Count > 0)
            {

                string itemXml = "";
                for (int i = 0; i < loginLogList.Rows.Count; i++)
                {
                    //调用插入4A审计日志
                    itemXml += string.Format(@"
                        <LOG4A>
                          <IDENTITY_NAME>4ABOSSLog</IDENTITY_NAME>
                          <RESOURCE_KIND>1</RESOURCE_KIND>
                          <RESOURCE_CODE>SCNGJJXC</RESOURCE_CODE>
                          <IDR_CREATION_TIME>{0}</IDR_CREATION_TIME>
                          <MAIN_ACCOUNT_NAME></MAIN_ACCOUNT_NAME>
                          <SUB_ACCOUNT_NAME>{1}</SUB_ACCOUNT_NAME>
                          <OPERATE_TIME>{2}</OPERATE_TIME>
                          <OP_TYPE_ID>1-KZYYT-10001</OP_TYPE_ID>
                          <OP_TYPE_NAME>登录</OP_TYPE_NAME>
                          <OP_LEVEL_ID>1</OP_LEVEL_ID>
                          <OPERATE_CONTENT>{3}</OPERATE_CONTENT>
                          <OPERATE_RESULT>0</OPERATE_RESULT>
                          <MODULE_ID>login</MODULE_ID>
                          <MODULE_NAME>登录模块</MODULE_NAME>
                          <TASK_CODE></TASK_CODE>
                          <BANKAPPROVE></BANKAPPROVE>
                          <BANKFLAG></BANKFLAG>
                          <CLIENT_NETWORK_ADDRESS>{4}</CLIENT_NETWORK_ADDRESS>
                          <CLIENT_NAME></CLIENT_NAME>
                          <CLIENT_ADDRESS>{5}</CLIENT_ADDRESS>
                          <CLIENT_PORT></CLIENT_PORT>
                          <CLIENT_MAC></CLIENT_MAC>
                          <CLIENT_CPU_SERIAL></CLIENT_CPU_SERIAL>
                          <SERVER_ADDRESS>10.95.240.6</SERVER_ADDRESS>
                          <SERVER_PORT></SERVER_PORT>
                          <SERVER_MAC></SERVER_MAC>
                          <TO_PROVINCES_ID></TO_PROVINCES_ID>
                          <TO_PROVINCES_NAME></TO_PROVINCES_NAME>
                          <FROM_PROVINCES_ID></FROM_PROVINCES_ID>
                          <FROM_PROVINCES_NAME></FROM_PROVINCES_NAME>
                        </LOG4A>
                        ", DateTime.Now, loginLogList.Rows[i]["SUB_ACCOUNT_NAME"].ToString(),
                         loginLogList.Rows[i]["OPERATE_TIME"].ToString(),
                          loginLogList.Rows[i]["OPERATE_CONTENT"].ToString(),
                           loginLogList.Rows[i]["CLIENT_NETWORK_ADDRESS"].ToString(),
                           loginLogList.Rows[i]["CLIENT_ADDRESS"].ToString());
                }
                xml = string.Format(@"
                    <?xml version=‘1.0‘ encoding=’UTF-8’?>
                    <ROOT>
                    {0}
                    </ROOT>
                    ", itemXml);
            }
            return xml;
        }

        /// <summary>
        /// 生成模块操作日志内容
        /// </summary>
        /// <param name="loginLogList"></param>
        /// <returns></returns>
        public string Generate4ALogXmlForModule(DataTable moduleLogList)
        {
            string xml = "";
            if (moduleLogList != null && moduleLogList.Rows.Count > 0)
            {

                string itemXml = "";
                for (int i = 0; i < moduleLogList.Rows.Count; i++)
                {
                    //调用插入4A审计日志
                    itemXml += string.Format(@"
                        <LOG4A>
                          <IDENTITY_NAME>4ABOSSLog</IDENTITY_NAME>
                          <RESOURCE_KIND>1</RESOURCE_KIND>
                          <RESOURCE_CODE>SCNGJJXC</RESOURCE_CODE>
                          <IDR_CREATION_TIME>{0}</IDR_CREATION_TIME>
                          <MAIN_ACCOUNT_NAME></MAIN_ACCOUNT_NAME>
                          <SUB_ACCOUNT_NAME>{1}</SUB_ACCOUNT_NAME>
                          <OPERATE_TIME>{2}</OPERATE_TIME>
                          <OP_TYPE_ID>1-KZYYT-10001</OP_TYPE_ID>
                          <OP_TYPE_NAME>登录</OP_TYPE_NAME>
                          <OP_LEVEL_ID>1</OP_LEVEL_ID>
                          <OPERATE_CONTENT>{3}</OPERATE_CONTENT>
                          <OPERATE_RESULT>0</OPERATE_RESULT>
                          <MODULE_ID>login</MODULE_ID>
                          <MODULE_NAME>登录模块</MODULE_NAME>
                          <TASK_CODE></TASK_CODE>
                          <BANKAPPROVE></BANKAPPROVE>
                          <BANKFLAG></BANKFLAG>
                          <CLIENT_NETWORK_ADDRESS></CLIENT_NETWORK_ADDRESS>
                          <CLIENT_NAME></CLIENT_NAME>
                          <CLIENT_ADDRESS></CLIENT_ADDRESS>
                          <CLIENT_PORT></CLIENT_PORT>
                          <CLIENT_MAC></CLIENT_MAC>
                          <CLIENT_CPU_SERIAL></CLIENT_CPU_SERIAL>
                          <SERVER_ADDRESS>10.95.240.6</SERVER_ADDRESS>
                          <SERVER_PORT></SERVER_PORT>
                          <SERVER_MAC></SERVER_MAC>
                          <TO_PROVINCES_ID></TO_PROVINCES_ID>
                          <TO_PROVINCES_NAME></TO_PROVINCES_NAME>
                          <FROM_PROVINCES_ID></FROM_PROVINCES_ID>
                          <FROM_PROVINCES_NAME></FROM_PROVINCES_NAME>
                        </LOG4A>
                        ", DateTime.Now, moduleLogList.Rows[i]["SUB_ACCOUNT_NAME"].ToString(),
                         moduleLogList.Rows[i]["OPERATE_TIME"].ToString(),
                          moduleLogList.Rows[i]["OPERATE_CONTENT"].ToString());
                }
                xml = string.Format(@"
                    <?xml version=‘1.0‘ encoding=’UTF-8’?>
                    <ROOT>
                    {0}
                    </ROOT>
                    ", itemXml);
            }
            return xml;
        }
        #endregion

        #region 数据库操作
        public DataTable ExcuteToTable(string sql)
        {
            //SqlConnection myConnection = new SqlConnection("server=(local);Integrated Security=SSPI;database=northwind");
            string sqlConn = "Database=jjxc;UID=jjxc_jk;[email protected]";

            DataSet ds = Db2Helper.Helper_DB2.ExecuteDataset(sqlConn, System.Data.CommandType.Text, sql);

            return ds.Tables[0];
        }

        public int ExecuteNonQuery(string sql)
        {
            string sqlConn = "Database=jjxc;UID=jjxc_jk;[email protected]";

            return Db2Helper.Helper_DB2.ExecuteNonQuery(sqlConn, System.Data.CommandType.Text, sql);
        }
        #endregion

        #region 查询满足审计的日志sql

        /// <summary>
        /// 获取满足条件的登录日志
        /// </summary>
        /// <returns></returns>
        public DataTable GetLoginLog(DateTime currTime)
        {

            //获取最近3分钟登录信息
            string sql = string.Format(@"SELECT    ‘<![CDATA[登录:用户名=‘
                       || TRIM (B.NAME)
                       || ‘,工号=‘
                       || B.LOGIN_NAME
                       || ‘,登录时间=‘
                       || TO_CHAR (A.LOGIN_TIME, ‘YYYY-MM-DD HH24:MI:SS‘)
                       || ‘,登录系统=计件系统,登录IP=‘
                       || A.LOGIN_HOST
                       || ‘]]>‘
                          OPERATE_CONTENT,
                       A.LOGIN_TIME OPERATE_TIME,
                       B.LOGIN_NAME SUB_ACCOUNT_NAME,
                       A.LOGIN_HOST CLIENT_NETWORK_ADDRESS,
                       A.LOGIN_HOST CLIENT_ADDRESS
                  FROM CC_LOGIN_HISTORY A, CC_USER B
                 WHERE     A.USER_ID = B.ID
                       AND A.LOGIN_TIME + 3 MINUTE > TIMESTAMP(REPLACE(‘{0}‘,‘/‘,‘-‘))
                       AND A.TAG IS NULL", currTime);
            return ExcuteToTable(sql);
        }
        /// <summary>
        /// 获取满足条件的模块操作日志
        /// </summary>
        /// <returns></returns>
        public DataTable GetMoudelLog(DateTime currTime)
        {
            string sql = string.Format(@"
                SELECT LOGIN_NAME SUB_ACCOUNT_NAME,
                       LOG_DATE OPERATE_TIME,
                          ‘<![CDATA[模块操作:用户名=‘
                       || TRIM (USER_NAME)
                       || ‘,工号=‘
                       || LOGIN_NAME
                       || ‘,操作时间=‘
                       || TO_CHAR (LOG_DATE, ‘YYYY-MM-DD HH24:MI:SS‘)
                       || ‘,登录系统=计件系统,内容=‘
                       || PERMISSION
                       || ‘||‘
                       || DESCRIPTION
                       || ‘]]>‘
                          OPERATE_CONTENT
                  FROM CC_OPERATION_LOG
                 WHERE LOG_DATE + 3 MINUTE >  TIMESTAMP(REPLACE(‘{0}‘,‘/‘,‘-‘))  AND TAG IS NULL
                ", currTime);
            return ExcuteToTable(sql);
        }
        #endregion

        /// <summary>
        /// 拼装wsdl文件
        /// </summary>
        /// <param name="record"></param>
        /// <returns></returns>
        public string Wsdlxml(string record)
        {
            string wsdl = string.Format(@"
                <?xml version=""1.0"" encoding=""UTF-8""?>
                <definitions
                    xmlns:soap=""http://schemas.xmlsoap.org/wsdl/soap/""
                    xmlns:tns=""http://www.asiainfo.com/web""
                    xmlns:xsd=""http://www.w3.org/2001/XMLSchema""
                    xmlns=""http://schemas.xmlsoap.org/wsdl/""
                    targetNamespace=""http://www.asiainfo.com/web""
                    name=""AioxService"">
                    <types></types>
                    <message name=""requestMessage"">
                        <part name=""textRecord"" type=""xsd:string"">{0}</part>
                        <part name=""reservedItem1"" type=""xsd:string""></part>
                        <part name=""reservedItem2"" type=""xsd:int"">{1}</part>
                    </message>
                    <message name=""responseMessage"">
                        <part name=""result"" type=""xsd:int""></part>
                    </message>
                    <portType name=""AioxPortType"">
                        <operation name=""mediate"" parameterOrder=""textRecord reservedItem1 reservedItem2"">
                            <input message=""tns:requestMessage""></input>
                            <output message=""tns:responseMessage""></output>
                        </operation>
                    </portType>
                    <binding name=""AioxPortBinding"" type=""tns:AioxPortType"">
                        <soap:binding transport=""http://schemas.xmlsoap.org/soap/http"" style=""rpc""></soap:binding>
                        <operation name=""mediate"">
                            <soap:operation soapAction=""mediate""></soap:operation>
                            <input>
                                <soap:body use=""literal"" namespace=""http://www.asiainfo.com/web""></soap:body>
                            </input>
                            <output>
                                <soap:body use=""literal"" namespace=""http://www.asiainfo.com/web""></soap:body>
                            </output>
                        </operation>
                    </binding>
                    <service name=""AioxService"">
                        <port name=""AioxPort"" binding=""tns:AioxPortBinding"">
                            <soap:address location=""http://10.109.209.90:21010/gather/services/AioxPort""></soap:address>
                        </port>
                    </service>
                </definitions>
                ", record, 21010);
            return wsdl;
        }
    }
}

参考网址:

通过HttpWebRequest在后台对WebService进行调用

C# HttpWebRequest 绝技

C#HttpHelper类

时间: 2024-08-25 08:35:47

通过HttpWebRequest调用webService的相关文章

HttpWebRequest调用WebService后台需要Session信息问题的解决办法

今天在用HttpWebRequest调用后台ASP.NET 的WebService方法时遇到了一个问题,后台的WebService方法里使用到了Session对象中的用户信息,而Session对象中的用户信息是在登录时设置,介于小生此次仅是调用了一个WebService,并没有从Web页面登录,故没有Session信息而报错. WebService的方法不能更改,所以我决定模拟登录,先调用一个登录的WebService,设置好Session信息,然后再调用目标WebService即可获得Sess

HttpWebRequest调用webservice

1 public string GetCostWebservide() 2 { 3 string uri = "http://125.77.254.142:8011/WXService.asmx/GetCost"; 4 HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(uri); 5 string param = String.Empty; 6 param += String.Format("

[转]Net 下采用GET/POST/SOAP方式动态调用WebService C#实现

本文转自:http://www.cnblogs.com/splendidme/archive/2011/10/05/2199501.html 一直以来,我们都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出错,似乎要重新绑定Webservice并重新编译后才能再次运行.我无意中通过百度搜索找了一个采用GET/POST/SOAP方式动态调用WebService的

调用webservice 总结

最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice . 我们都知道,调用webserivice 最简单的方法就是在 "引用"  那里点击右键,然后选择"引用web服务",再输入服务地址. 确定后,会生成一个app.config 里面就会自动生成了一些配置信息. 现在正在做的这个项目就不能这么干.后来经过一番搜索,就找出另外几种动态调用webservice 的方法. 废话少说,下面是webservice 代码 u

动态调用WebService(C#) (非常实用)

前言 站在开发者的角度,WebService 技术确实是不再“时髦”.甚至很多人会说,我们不再用它.当然,为了使软件可以更简洁,更有层次,更易于实现缓存等机制,我是非常建议将 SOAP 转为 RESTful 架构风格的.但到目前为止,WebService 在一些Public Institution 中使用还是十分广泛的. 这里主要讨论一下关于WebService的调用问题.关于WebService 的调用分为静态调用和动态调用两种,外加直接Http请求方式 静态调用 静态调用的方式是通过“Add

C# 调用webservice 几种办法(转载)

原文地址: http://www.cnblogs.com/eagle1986/archive/2012/09/03/2669699.html //================================================================================================= 动态调用示例: 方法一: 看到很多动态调用WebService都只是动态调用地址而已,下面发一个不光是根据地址调用,方法名也可以自己指定的,主要原理是根据指定

直接代码POST数据调用WebService

原文:直接代码POST数据调用WebService ps:使用过webservice的童鞋大概都明白它是基于Soap协议交换数据的,同时Soap协议是对HTTP协议的扩展,其实我们就可以认为调用一个WEB服务就是通过http协议GET或POST数据的过程,只不过中间的输入/输出数据是遵守Soap协议格式的标准XML.明白这个道理之后我们就可以通过构造请求数据来模拟调用WEB服务的过程了,具体代码如下: using System; using System.Collections.Generic;

C#调用webService的几种方法

转自: WebClient 用法小结 http://www.cnblogs.com/hfliyi/archive/2012/08/21/2649892.html http://www.cnblogs.com/wpdev/archive/2011/08/22/about-webclient.html 网络编程之webclient和httpwebrequest的使用 http://www.cnblogs.com/cxd4321/p/3960538.html C#调用WebService http:/

wince 调用webservice

这两天公司做pos机,原来的做pos的人走了,程序已经基本写完. 我下载到wince里,发现一旦调用webservice,就会弹出 针对此异常的错误消息可用但无法显示,原因是这些消息是可选的,而当前未安装在此设备上.对于 Windows Mobile 5.0 及更高版本,请安装“NETCFv35.Messages.zh-CHS.wm.cab”,对于其他平台,请安装“NETCFv35.Messages.zh-CHS.cab”.重新启动应用程序查看该消息.位于 System.Net.HttpWebR