关于winform程序调用webservice是后的配置地址问题,看了网上很多资料,总体大概的都是说设置url属性来解决,但是都没有一个详细的解释,在这里重新问一下,看看哪位能详细解答小弟的疑惑:
1.就是winform的程序里面如果引用webaservice可以配置config来改变引用地址,一般在winform里面的config是 app.config,如果想动态指定webservice的ip的话,是不是直接更改这里的地址,还是说要在程序中再加入一个手动的引用url属性的方法(webservice引用是用vs05自带的添加web引用建立的)。
2.在webservice发布的网站中如果连接数据库的话动态设置连接数据库属性,应该在哪里添加这个引用代码,是在引用过来的winform程序中添加,还是在webservice网站中添加,用什么方法。
因为网上回答这些问题的答案都不一样,一会是引用app.config,一会是web.config,都说自己的对,所以希望有个对比性的答案。
------解决方案--------------------
winform 的app.config中添加webserv的地址
webservice中的wen.config添加数据库的连接参数
------解决方案--------------------
web.config内添加
<configuration>
<appSettings>
<add key="pfm" value="server=192.168.0.4;database=SaigeSystem;UID=sa;pwd=project.saige"></add>
</appSettings>
<system.web>
webservice
- C# code
public class Server : System.Web.Services.WebService { string strConnectString=""; public Server() { //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的 InitializeComponent(); strConnectString=System.Configuration.ConfigurationSettings.AppSettings["pfm"]; } [WebMethod] public string HelloWorld() { return "Hello World"; } }
------解决方案--------------------
- C# code
您会发现你写完了一个webservice在调用的时候发现怎也没办法调用,一个简单的webservice怎么不能使用,一肚子的怨恨,哈哈您可能没有为webservice设置代理。 下面就给您写个调用的用例和大家分享下。其实很简单,但是你没有想到的时候就会没有头绪。 //webservice实例化 WebService objService = new WebService(); string strDomain = ConfigurationSettings.AppSettings["domain"].ToString(); //判断是否启用代理服务器 if (strDomain.Trim() != "") { //域访问名 string strUserName = ConfigurationSettings.AppSettings["UserName"].ToString(); //域访问密码 string strPassWord = ConfigurationSettings.AppSettings["PassWord"].ToString(); //代理地址 string strHost = ConfigurationSettings.AppSettings["Host"].ToString(); //代理端口 int strPort = Convert.ToInt32(ConfigurationSettings.AppSettings["Port"].ToString()); //设置代理 System.Net.WebProxy oWebProxy = new System.Net.WebProxy(strHost, strPort); // 获取或设置提交给代理服务器进行身份验证的凭据 oWebProxy.Credentials = new System.Net.NetworkCredential(strUserName, strPassWord, strDomain); objService.Proxy = oWebProxy; //window程序通过代理访问webservice方法GetData DataSet dst = objService.GetData(); }
------解决方案--------------------
- C# code
手工发送HTTP请求主要是调用System.Net的HttpWebResponse方法 手工发送HTTP的GET请求: string strURL = "http://localhost/Play/CH1/Service1.asmx/doSearch?keyword="; strURL +=this.textBox1.Text; System.Net.HttpWebRequest request; //创建一个HTTP请求 request = (System.Net.HttpWebRequest)WebRequest.Create(strURL); //request.Method="get"; System.Net.HttpWebResponse response; response = (System.Net.HttpWebResponse)request.GetResponse(); System.IO.Stream s; s = response.GetResponseStream(); XmlTextReader Reader = new XmlTextReader(s); Reader.MoveToContent(); string strValue = Reader.ReadInnerXml(); strValue = strValue.Replace("<","<"); strValue = strValue.Replace(">",">"); MessageBox.Show(strValue); Reader.Close(); 手工发送HTTP的POST请求 string strURL = "http://localhost/Play/CH1/Service1.asmx/doSearch"; System.Net.HttpWebRequest request; request = (System.Net.HttpWebRequest)WebRequest.Create(strURL); //Post请求方式 request.Method="POST"; //内容类型 request.ContentType="application/x-www-form-urlencoded"; //参数经过URL编码 string paraUrlCoded = System.Web.HttpUtility.UrlEncode("keyword"); paraUrlCoded += "=" + System.Web.HttpUtility.UrlEncode(this.textBox1.Text); byte[] payload; //将URL编码后的字符串转化为字节 payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded); //设置请求的ContentLength request.ContentLength = payload.Length; //获得请求流 Stream writer = request.GetRequestStream(); //将请求参数写入流 writer.Write(payload,0,payload.Length); //关闭请求流 writer.Close(); System.Net.HttpWebResponse response; //获得响应流 response = (System.Net.HttpWebResponse)request.GetResponse(); System.IO.Stream s; s = response.GetResponseStream(); XmlTextReader Reader = new XmlTextReader(s); Reader.MoveToContent(); string strValue = Reader.ReadInnerXml(); strValue = strValue.Replace("<","<"); strValue = strValue.Replace(">",">"); MessageBox.Show(strValue); Reader.Close(); Get请求与Post请求的主要区别在于Post的参数要经过URL编码并在获得请求之前传送,而Get把参数用URL编码后直接附加到请求的URL后面 URL编码是一种字符编码格式,它确保传递的参数由一致的文本组成(如将空格编码为"%20")