编写 .asmx Web 服务

  1. 打开 Visual Studio .NET。
  2. 在"文件" 菜单上,选择 "新建"并选择"Project"。 在 Project类型"下,选择 "可视C#项目"。 然后在 "ASP.NET 下选择"Web 服务"。 在"位置"文本框  键入 MathService, 以将 WebService1 (的默认名称) MathService。
  3. 将从 Service1.asmx 创建的默认 Web 服务的名称更改为 MathService.asmx。
  4. 选择 "单击 "以切换到设计器环境中的代码视图。
  5. 定义封装服务功能的方法。 从服务公开的每个方法都必须在它前面标记 ​​WebMethod​​ 一个属性。 如果没有此属性,将不会从服务公开该方法。

     备注
    并非每个方法都需要具有 ​​WebMethod​​ 属性。 隐藏由公共 Web 服务方法调用的一些实现详细信息或隐藏在本地应用程序中也使用该类的情况 ​​WebService​​ 很有用。 本地应用程序可以使用任何公共类,但只有方法才能作为 Web 服务 ​​WebMethod​​ 远程访问。

    将以下方法添加到 ​​MathServices​​ 您创建的类:
[WebMethod]
public int Add(int a, int b)
{
return(a + b);
}
[WebMethod]
public System.Single Subtract(System.Single A, System.Single B)
{
return (A - B);
}
[WebMethod]
public System.Single Multiply(System.Single A, System.Single B)
{
return A * B;
}
[WebMethod]
public System.Single Divide(System.Single A, System.Single B)
{
if(B == 0) return -1;
return Convert.ToSingle(A / B);
}

6.在 "生成**"菜单上选择**"生成"以生成 Web 服务。

7.浏览到 MathService.asmx Web 服务页以测试 Web 服务。 如果将本地计算机设置为承载页面,则 URL 为 ​​http://localhost/MathService/MathService.asmx​​ 。

运行时 ASP.NET 返回描述 Web 服务的 Web 服务帮助页。 此页面还允许您测试不同的 Web 服务方法。


使用 Web 服务

  1. 打开 Visual Studio .NET。
  2. 在 Project类型"下,选择 "visual C# Projects", 然后选择"模板"下的"控制台应用程序"。
  3. 将 MathService Web 服务的引用添加到新的控制台应用程序。此步骤在客户端计算机上创建代理类。 代理类存在后,您可以基于该类创建对象。 然后,使用 对象进行的每个方法调用都会转到 Web 服务的统一资源标识符 (URI) , (通常作为 SOAP 请求) 。
  1. 在 "Project" 菜单上,选择"添加 Web 引用"。
  2. 在 "添加 Web 引用"对话框中的"地址"文本框中键入Web 服务的 URL,然后按 Enter。 如果将本地计算机设置为承载 Web 服务,则 URL 为 ​​http://localhost/MathService/MathService.asmx​​ 。
  3. 选择“添加引用”。 或者,您可以键入发现文件 (MathService.vsdisco) 的 URL,或在左窗格中选择"本地 Web 服务器上 Web 引用",从列表中选择 MathService 服务。
  4. 展开" 解决方案资源管理器"的"Web 引用"部分,并记下所使用的命名空间。
  1. 创建已创建的代理对象的实例。 将以下代码放在 名为 的函数中 ​​Main​​ :
    C#复制
    ​localhost.Service1 myMathService = new localhost.Service1(); ​
  2. 对在上一步中创建的代理对象调用方法,如下所示:
    C#复制
    ​Console.Write("2 + 4 = {0}", myMathService.Add(2,4)); ​
  3. 在 "生成**"菜单上选择**"生成"以生成控制台应用程序。
  4. 在 "调试 " 菜单上选择 "开始"以测试应用程序。
  5. 关闭并保存项目

以上是微软的官方实例,下面写我自己的, 功能:返回xml格式数据,供三方 接口使用;

using Newtonsoft.Json.Linq;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Web;

using System.Web.Services;

using System.Web.UI.WebControls;

using System.Xml;

/// <summary>

/// WebService 的摘要说明

/// </summary>

[WebService(Namespace = "item.get.material")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。  

// [System.Web.Script.Services.ScriptService]

public class WebService : System.Web.Services.WebService

{

   public WebService()

   {

       //如果使用设计的组件,请取消注释以下行  

       //InitializeComponent();  

   }

   [WebMethod]

   public XmlDocument invokeSrv(string filter)

   {

       Helper h = new Helper();

       StringBuilder s = new StringBuilder();

       if (h.login())

       {

           //登录成功

           List<string> l = h.GetDetailByFnumber("BD_MATERIAL", " FCREATEDATE>='" + filter + "'");

           s.Append("<response><srvver>1.0</srvver><srvcode>000</srvcode><payload>");

           s.Append("<param key =\"std_data\" type=\"xml\"><data_response><execution><status code = \"0\" sql_code =\"\" description = \"SUCCESS\" /></execution>");

           s.AppendLine("<datainfo><parameter key =\"data_time\" type =\"date\">"+(Convert.ToDateTime(filter).ToString("yyyyMMddHHmmssfff")) + "</parameter>");

           s.AppendLine("<parameter key =\"key_condition\" type =\"string\">"+ filter + "</parameter><parameter key = \"item_data\"");


           s.Append("type = \"data\"><data name = \"item\" cnt =\"" + l.Count() + "\" tt_cnt = \"" + l.Count() + "\">");//头部

           int seq = 0;

           foreach (string row in l)//循环拼接中部xml

           {

               seq++;

               JObject reInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(row);

               JObject relt = JObject.Parse(reInfo["Result"].ToString());

               JObject reltlt = JObject.Parse(relt["Result"].ToString());

               string id = Convert.ToString(reltlt["Id"]);

               string fnumber = Convert.ToString(reltlt["Number"]);

               JArray jn = JArray.Parse(reltlt["Name"].ToString());

               string name = Convert.ToString(jn[0]["Value"]);

               string documentStatus = Convert.ToString(reltlt["DocumentStatus"]);

               JArray mal = JArray.Parse(reltlt["MaterialBase"].ToString());

               JObject baseu = JObject.Parse(mal[0]["BaseUnitId"].ToString());

               JArray baseNamej = JArray.Parse(baseu["Name"].ToString());

               string baseName = Convert.ToString(baseNamej[0]["Value"]);

               s.Append("<row seq=\"" + seq + "\"><field name = \"Id\" type =\"string\">" + id + "</field><field name = \"fnumber\" type =\"string\">" + fnumber + "</field><field name =\"name\" type =\"string\">" + name + "</field ><field name = \"documentStatus\" type =\"string\">" + documentStatus + "</field><field name = \"baseName\" type =\"string\">" + baseName + "</field> </row>");

           }

           s.Append(" </data></parameter></datainfo></data_response></param></payload></response>");

       }

       else

       {

           //登录失败

           s.Append(@"<?xml version = 1.0?>< response >< srvver > 1.0 </ srvver >< srvcode > 100 </ srvcode >< payload >< param type = 'xml' key = 'std_data' >< data_response >< execution >< status description = '没有对应的物料信息' sql_code = '0000' code ='Error' /></ execution ></ data_response ></ param ></ payload ></ response >");

       }

       XmlDocument document = new XmlDocument();

       document.LoadXml(s.ToString());

       return document;

   }

}

结果展示:

c# WebServices开发实例_web.config

最后如果把webservices发布到外网,点击方法会提示如下错误:

“webservice远程测试显示 “测试窗体只能用于来自本地计算机”

解决方法是在web.config上加上此代码:

 <system.web>

    <webServices>

        <protocols>

           <add name="HttpSoap"/>

           <add name="HttpPost"/>

           <add name="HttpGet"/>

           <add name="Documentation"/>

        </protocols>

     </webServices>

 </system.web>