当前位置: 代码迷 >> Web Service >> winform 调用webservice地址有关问题!
  详细解决方案

winform 调用webservice地址有关问题!

热度:852   发布时间:2011-12-27 22:22:54.0
winform 调用webservice地址问题!!
关于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("&lt;","<");
   strValue = strValue.Replace("&gt;",">");
   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("&lt;","<");
   strValue = strValue.Replace("&gt;",">");
   MessageBox.Show(strValue); 
   Reader.Close();

Get请求与Post请求的主要区别在于Post的参数要经过URL编码并在获得请求之前传送,而Get把参数用URL编码后直接附加到请求的URL后面
URL编码是一种字符编码格式,它确保传递的参数由一致的文本组成(如将空格编码为"%20")
 
  相关解决方案