Xamarin.Android 入门实例(2)之实现WCF 寄宿于IIS 的Web服务提供

时间:2023-03-10 02:22:55
Xamarin.Android 入门实例(2)之实现WCF 寄宿于IIS 的Web服务提供

1.WCF 契约 ICalculator.cs

 using System.ServiceModel;
namespace Contracts
{
[ServiceContract]
public interface ICalculator
{
/// <summary>
/// 加法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
[OperationContract]
[DataContractFormat(Style = OperationFormatStyle.Rpc)]
double AddDouble(double x, double y); /// <summary>
/// 加法
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <param name="num">结果</param>
/// <returns></returns>
[OperationContract]
[DataContractFormat(Style = OperationFormatStyle.Rpc)]
string Add(double num1, double num2, ref double num); /// <summary>
/// 减法
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <param name="num">结果</param>
/// <returns></returns>
[OperationContract]
[DataContractFormat(Style = OperationFormatStyle.Rpc)]
string Reduce(double num1, double num2, ref double num); /// <summary>
/// 乘法
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <param name="num">结果</param>
/// <returns></returns>
[OperationContract]
[DataContractFormat(Style = OperationFormatStyle.Rpc)]
string Multiplication(double num1, double num2, ref double num); /// <summary>
/// 除法
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <param name="num">结果</param>
/// <returns></returns>
[OperationContract]
[DataContractFormat(Style = OperationFormatStyle.Rpc)]
string Division(double num1, double num2, ref double num); } }

注意:

在客户端添加Web引用时为避免额外的布尔值参数被使用,确保代理客户端强制执行时使用的RPC风格的编码,这是SOAP 1.1规范的一部分。

请参考随笔:

Web Reference for a WCF Service has Extra “IdSpecified” Parameter ?

http://www.cnblogs.com/mschen/p/4262090.html

2. 服务实现 CalculatorService.cs

 using System;
using System.Collections.Generic;
using System.Text;
using Contracts; namespace Services
{
public class CalculatorService : ICalculator
{
/// <summary>
/// 加法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public double AddDouble(double x, double y)
{
return x + y;
} /// <summary>
/// 加法
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <param name="num">结果</param>
/// <returns></returns>
///
public string Add(double num1, double num2, ref double num)
{
try
{
num = num1 + num2;
return "";
}
catch (Exception ex)
{
return ex.ToString();
}
} /// <summary>
/// 减法
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <param name="num">结果</param>
/// <returns></returns>
public string Reduce(double num1, double num2, ref double num)
{
try
{
num = num1 - num2;
return "";
}
catch (Exception ex)
{
return ex.ToString();
}
} /// <summary>
/// 乘法
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <param name="num">结果</param>
/// <returns></returns>
public string Multiplication(double num1, double num2, ref double num)
{
try
{
num = num1 * num2;
return "";
}
catch (Exception ex)
{
return ex.ToString();
}
} /// <summary>
/// 除法
/// </summary>
/// <param name="num1">第一个数</param>
/// <param name="num2">第二个数</param>
/// <param name="num">结果</param>
/// <returns></returns>
public string Division(double num1, double num2, ref double num)
{
try
{
num = num1 / num2;
return "";
}
catch (Exception ex)
{
return ex.ToString();
}
} }
}

3.IIS 创建文件CalculatorService.svc

<%@ServiceHost Service="Services.CalculatorService"%>

4.IIS 寄宿服务配置,基于basicHttpBinding绑定 Web.config

 <?xml version="1.0"?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="CalculatorBehavior" name="Services.CalculatorService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration=""
contract="Contracts.ICalculator" />
<host>
<baseAddresses>
<add baseAddress="http://192.168.1.2:8080/CalculatorService.svc" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
<system.web>
<compilation debug="true"/>
</system.web>
</configuration>

注意:为了保证 soap:address location 和wsdl:import location 显示和url里面的ip或者域名是一致请使用:<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> ,multipleSiteBindingsEnabled 是.net framework 4里面支持的特性,如果版本低于4,例如3.5 那么就要根据IIS binding来设置baseAddress.

5.Main.axml 视图

Xamarin.Android 入门实例(2)之实现WCF 寄宿于IIS 的Web服务提供

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:id="@+id/txtPhoneNo"
android:layout_width="304.0dp"
android:phoneNumber="true"
android:hint="请输入第一个数"
android:layout_height="wrap_content"
android:layout_marginTop="5px"
android:layout_marginLeft="5px" />
<EditText
android:id="@+id/txtSMS"
android:layout_width="313.3dp"
android:layout_height="40.0dp"
android:phoneNumber="true"
android:gravity="top"
android:hint="请输入第二个数"
android:layout_below="@id/txtPhoneNo" />
<Button
android:id="@+id/btnadd"
android:text="加"
android:layout_width="69dp"
android:layout_height="wrap_content"
android:layout_below="@id/txtSMS" />
<Button
android:id="@+id/btnjian"
android:text="减"
android:layout_width="69dp"
android:layout_height="wrap_content"
android:layout_below="@id/txtSMS"
android:layout_toRightOf="@id/btnadd" />
<Button
android:id="@+id/btncheng"
android:text="乘"
android:layout_width="69dp"
android:layout_height="wrap_content"
android:layout_below="@id/txtSMS"
android:layout_toRightOf="@id/btnjian" />
<Button
android:id="@+id/btnchu"
android:text="除"
android:layout_width="69dp"
android:layout_height="wrap_content"
android:layout_below="@id/txtSMS"
android:layout_toRightOf="@id/btncheng" />
<EditText
android:id="@+id/txtjieguo"
android:layout_width="fill_parent"
android:layout_height="40.7dp"
android:gravity="top"
android:hint=""
android:layout_below="@id/btnchu" />
</RelativeLayout>

6.Activity1.cs

using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS; namespace Databasedemo
{
[Activity(Label = "Databasedemo", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity1 : Activity
{ EditText tvjg;
EditText num1;
EditText num2;
double num = ;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle); // Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main); //加
Button btnadd = FindViewById<Button>(Resource.Id.btnadd);
//减
Button btnjian = FindViewById<Button>(Resource.Id.btnjian);
//乘
Button btncheng = FindViewById<Button>(Resource.Id.btncheng);
//除
Button btnchu = FindViewById<Button>(Resource.Id.btnchu);
//第一个数
num1 = FindViewById<EditText>(Resource.Id.txtPhoneNo);
//第二个数
num2 = FindViewById<EditText>(Resource.Id.txtSMS);
//结果
tvjg = FindViewById<EditText>(Resource.Id.txtjieguo); var ca = new WebReference.CalculatorService(); btnadd.Click += delegate
{
double num1s = Convert.ToDouble(num1.Text.ToString());
double num2s = Convert.ToDouble(num2.Text.ToString()); string flag = ca.Add(num1s, num2s, ref num);
tvjg.Text = num1s.ToString() + "+" + num2s.ToString() + "=" + num.ToString();
}; btnjian.Click += delegate
{
double num1s = Convert.ToDouble(num1.Text.ToString());
double num2s = Convert.ToDouble(num2.Text.ToString()); string flag = ca.Reduce(num1s, num2s, ref num);
tvjg.Text = num1s.ToString() + "-" + num2s.ToString() + "=" + num.ToString();
}; btncheng.Click += delegate
{
double num1s = Convert.ToDouble(num1.Text.ToString());
double num2s = Convert.ToDouble(num2.Text.ToString()); string flag = ca.Division(num1s, num2s, ref num);
tvjg.Text = num1s.ToString() + "*" + num2s.ToString() + "=" + num.ToString();
};
btnchu.Click += delegate
{
double num1s = Convert.ToDouble(num1.Text.ToString());
double num2s = Convert.ToDouble(num2.Text.ToString()); string flag = ca.Multiplication(num1s, num2s, ref num);
tvjg.Text = num1s.ToString() + "/" + num2s.ToString() + "=" + num.ToString();
};
}
}
}

模拟器

Xamarin.Android 入门实例(2)之实现WCF 寄宿于IIS 的Web服务提供

运行效果

Xamarin.Android 入门实例(2)之实现WCF 寄宿于IIS 的Web服务提供

源码下载:

WCFforIIS.zip

Databasedemo.zip