WebService的開發、部署、調用

來源:互聯網
上載者:User

標籤:des   style   blog   class   code   c   

本文參考其它文章和自己解決中間問題的經曆記錄,以C#開發WebService為例子,歡迎探討:

一、C#開發WebService

  1. 在visual studio中建立ASP.NET Web服務應用程式,取名MyWebService。
  2. 刪除自動產生的程式碼,輸入以下程式碼片段,包括多個方法:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;

namespace WebServicetest
{
    /// <summary>
    /// Service1 的摘要說明
    /// </summary>
    [WebService(Namespace = "http://192.168.1.201")]    //為自己以後webservice發布虛擬目錄所在的網域名稱
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // 若要允許使用 ASP.NET AJAX 從指令碼中調用此 Web 服務,請取消對下行的注釋。
    [System.Web.Script.Services.ScriptService]   //啟動對指令碼的支援
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod(Description = "預設的方法")]
        public string HelloWorld()
        {
            return "Hello World";
        }
        [WebMethod(Description = "求和的方法")]
        public double addition(double i, double j)
        {
            return i + j;
        }
        [WebMethod(Description = "求差的方法")]
        public double subtract(double i, double j)
        {
            return i - j;
        }
        [WebMethod(Description = "求積的方法")]
        public double multiplication(double i, double j)
        {
            return i * j;
        }
        [WebMethod(Description = "參數返回中文方法")]
        public string myhello(string name, string department)
        {
            return "您的姓名:" + name + "<br>" + "您的單位:" + department + "<br>";
        }

    }
}

 

初步產生後,可以CTRL+F5啟動內建的調試器測試WebService,查看定義的調用方法,如所示:

點擊具體的方法,可以測試。

調用測試結果如下:

 

二、WebService部署

  1. 調試通過後發布WebService。
  1. 將發布後的檔案目錄拷貝的Web伺服器(安裝有IIS的機器),建立虛擬目錄,和發布網站一樣,指向該目錄。如:

遠程地址:http://192.168.1.201/myservice/service1.asmx(該伺服器的IP地址為:192.168.1.201)為了測試可行性,在用戶端輸入這個網址進行測試,看能否訪問調用。如:

我們會發現,從遠程Client Access Server上的WebService能夠顯示,但點擊調用相關的方法時顯示“只能用於來自本機電腦的請求”,這時提醒我們還需要在伺服器進行相關的配置才能讓其他機器正常訪問該WebService。具體配置方法如下:

修改webconfig檔案,在system.web節點下面加入下面代碼?:

<webServices > 
<protocols > 
<add name="HttpSoap"/> 
<add name="HttpPost"/> 
<add name="HttpGet"/> 
<add name="Documentation"/> 
</protocols> 
</webServices>

即可實現遠端存取webservice。最終效果

三、WebService的調用

 

1.在asp.net中調用(轉自http://www.cnblogs.com/xuetuyuan/archive/2011/02/22/1961322.html)

(1)建立ASP.NET Web應用程式,在Default.aspx頁面中添加控制項如下:

(2)添加Web引用,Web引用名:WebReference。如:

 

(3)添加相關調用代碼如下:

public partial class _Default : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            WebReference.WebServiceDemo s = new WebReference.WebServiceDemo();

            //調用WebService的HelloWorld方法,返回"HelloWorld",並輸出.

            Response.Write(s.HelloWorld());

        }

        protected void btnConvert_Click(object sender, EventArgs e)

        {

            WebReference.WebServiceDemo s = new WebReference.WebServiceDemo();

            //調用WebService的ConvertTemperature方法,實現溫度轉換.

            labResult.Text = "轉換後的溫度是:" + s.ConvertTemperature(double.Parse(txtResult.Text));

        }

}

 

(4)測試結果如下:

 

2.js調用webservice+xmlhttp的實現部分(轉自http://www.zahui.com/html/4/37953.htm)

<html>
 <title>Call webservice with javascript and xmlhttp.</title>
<body>
 <mce:script language="javascript"><!--
 

 //test function with get method.
 function RequestByGet(data){ 
  var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
  //Webservice location.
  var URL="http://localhost:1323/WebSite6/Service.asmx/SayHelloTo?Name=Zach";
  xmlhttp.Open("GET",URL, false); 
  xmlhttp.SetRequestHeader ("Content-Type","text/xml; charset=utf-8"); 
  xmlhttp.SetRequestHeader ("SOAPAction","http://tempuri.org/SayHelloTo"); 
  xmlhttp.Send(data); 
  var result = xmlhttp.status; 
  //OK
  if(result==200) { 
   document.write(xmlhttp.responseText); 
  } 
  xmlhttp = null; 
 }

 //test function with post method
 function RequestByPost(value)
 {
  var data;
  data = ‘<?xml version="1.0" encoding="utf-8"?>‘; 
  data = data + ‘<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">‘; 
  data = data + ‘<soap:Body>‘; 
  data = data + ‘<SayHelloTo xmlns="http://tempuri.org/">‘; 
  data = data + ‘<Name>‘+value+‘</Name>‘; 
  data = data + ‘</SayHelloTo>‘; 
  data = data + ‘</soap:Body>‘; 
  data = data + ‘</soap:Envelope>‘;

  var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
  var URL="http://localhost:1323/WebSite6/Service.asmx";
  xmlhttp.Open("POST",URL, false); 
  xmlhttp.SetRequestHeader ("Content-Type","text/xml; charset=gb2312"); 
  xmlhttp.SetRequestHeader ("SOAPAction","http://tempuri.org/SayHelloTo"); 
  xmlhttp.Send(data); 
  document.write( xmlhttp.responseText); 
 }

 
// --></mce:script>

 <input type="button" value="CallWebserviceByGet" onClick="RequestByGet(null)">
 <input type="button" value="CallWebserviceByPost" onClick="RequestByPost(‘Zach‘)">
</body>
</html>

其中webservice的地址可以換成已經發布好的遠程伺服器位址即可,該代碼未經測試,正確性不予保證。

 

3.通過js簡單調用webservice(經過測試,能夠運行,但IE9不相容)

(1)用戶端代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>WebServiceTest</title>
<script language="javascript">
var intCallID;
function init()
{


//第一個參數是webservice的url,後面是名稱

 hello.useService("http://192.168.1.201/myservice/service1.asmx?WSDL","MyName");  
}

function calltest()
{
 //如果該webservice有參數的話,在括弧後加逗號分隔。
 intCallID=hello.MyName.callService("myhello",document.getElementsByName("name")[0].value,document.getElementsByName("department")[0].value); //no param
 }

function callback_result()
{
 if ((event.result.error)&&(intCallID==event.result.id))
    {
     var xfaultcode = event.result.errorDetail.code;
     var xfaultstring = event.result.errorDetail.string;
      var xfaultsoap = event.result.errorDetail.raw;

       // Add code to output error information here
       alert(xfaultstring);
    }
    else
    {
       hello.innerHTML+= "測試調用結果為:<br>"+ event.result.value;
    }
 
}
</script>
</head>

<body onload="init();">
<p>&nbsp;</p>
<label>姓名:
  <input type="text" name="name" id="name" />
  <br />
  單位:
  <input type="text" name="department" id="department" />
  <br />
</label>
<div id="hello"  style="behavior:url(webservice.htc)" onresult="callback_result();" ></div>
<input name="button" type="button" onClick="calltest();" value="調用測試" />
</body>
</html>

調用測試介面

填入參數,點擊按鈕,頁面DIV重新整理變化為:

 

通過javascript和webservice.htc附加到HTML元素(例如DIV)調用法有以下幾個注意問題:

a.由於js不能跨域調用,而導致調用頁面和webservice所在網站不在同一伺服器會導致問題,解決方案尋找相關資料如下:

出於安全考慮禁止跨域調用其他頁面的對象,因此也導致了js使用跨域的web service成為問題。解決方案: 
1.設定document.domain 
前提條件:兩個頁面同屬於一個基礎域(例如都是xxx.com,或是xxx.com.cn);同一協議(例如都是http);同一連接埠(例如都是80)。 
方法:設定兩個頁面的document.domain都設定為自己所在的基礎網域名稱。 
例子:aaa.xxx.com裡面的一個頁面需要調用bbb.xxx.com裡的一個對象,則將兩個頁面的document.domain都設定為xxx.com,就可以了。 

2.在伺服器端設定代理 
跨域的請求同樣發送到本機伺服器端,由伺服器端的代理來請求相應的資料,然後發送給瀏覽器端。這樣實際上瀏覽器端的所有請求都是發到相同的域,在伺服器端代理的協助下,實現了跨域的能力。 
3.使用 標籤 
當同時具有兩個域的開發許可權時就可以使用該方法了,原理是JS檔案注入,在本域內的a內產生一個JS標籤,SRC指向請求的另外一個域的某個頁面b,b返回資料即可,可以直接返回JS的代碼。

b.利用JS調用webservice需要用到微軟的webservice.htc檔案,可以在微軟官方網站下載到,放到和調用頁面同路徑即可。例如:<div id="hello"  style="behavior:url(webservice.htc)" onresult="callback_result();" ></div>

 

 

其它諸如返回多值、例如數組等,相容性問題(經測試IE9不相容js調用方法),更進階應用程式方法還有待進一步應用,此文章僅興趣測試而寫,不周之處,口下留情!當然也歡迎網友多多指導,告以其中謬誤和原理!

 

轉載:http://blog.csdn.net/yongping8204/article/details/6923334

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.