在开发过程中,经常需要在ASP.NET MVC应用程序中访问WCF服务。通常情况下,会通过添加服务引用或生成代理类来实现这一点。但是,这种方式可能会增加项目复杂度,并且难以管理。本文将介绍一种更简洁的方法,即使用代码直接访问WCF服务,而无需添加代理或服务引用。
首先,需要将服务契约和数据契约放入一个共享库(WCF服务库),以便客户端应用程序可以引用。
1. 在文件菜单中,点击“新建项目”。 2. 在新建项目对话框中,展开“Visual C#”,然后点击“WCF”并选择“WCF服务库”。在名称框中输入“ServiceLibrary”,在解决方案名称中输入“WCFDemo”,然后点击“确定”。 3. 删除默认创建的接口和类“IService1.cs”和“Service1.cs”。 4. 通过右键点击“ServiceLibrary(项目)”>“添加”>“新建项”,然后选择“接口”,将其命名为“IUser.cs”,然后点击“添加”。 5. 将接口“IPayment”的访问修饰符设置为public。
public interface IPayment
{
}
6. 需要给接口“IPayment”添加[ServiceContract]属性。
[ServiceContract]
public interface IPayment
{
}
7. 在IPayment接口中声明一个名为“ReverseString”的操作,并添加[OperationContract]属性。
[ServiceContract]
public interface IPayment
{
[OperationContract]
string ReverseString(string original);
}
1. 右键点击解决方案资源管理器中的“WCFDemo”>“添加”>“新建项目”。 2. 在新建项目对话框中,展开“Visual C#”,然后点击“WCF”并选择“WCF服务应用程序”。在名称框中输入“WCFService”,然后点击“确定”。 3. 删除默认创建的接口和服务“IService1.cs”和“Service1.svc”。 4. 通过右键点击“WCFService(项目)”>“添加”>“新建项”,然后选择“WCF服务”,将其命名为“User.svc”。 5. 从“WCFService(项目)”中删除接口“IUser.cs”,因为已经在“ServiceLibrary(项目)”中添加了这个接口。 6. 将“ServiceLibrary”的引用添加到“WCFService”中。右键点击“WCFService(项目)”的引用,然后点击“添加引用”。 7. 在引用管理器对话框中,选择“项目”下的“解决方案”,然后勾选“ServiceLibrary”,然后点击“确定”。 8. 现在,“ServiceLibrary”项目的引用已经添加到“WCFService”项目中。接下来,需要实现“ReverseString”操作。将以下代码粘贴到User.svc.cs中。
using ServiceLibrary;
public class User : IUser
{
public string ReverseString(string original)
{
if (string.IsNullOrWhiteSpace(original))
return string.Empty;
char[] charArray = original.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
}
1. 右键点击解决方案资源管理器中的“WCFDemo”>“添加”>“新建项目”。 2. 在新建项目对话框中,展开“Visual C#”,然后点击“Web”并选择“ASP.NET Web应用程序”。将其命名为“WebApps”,然后点击“确定”。 3. 现在,在对话框中点击ASP.NET 4.5.2模板下的“Empty”,然后勾选“MVC”复选框,然后点击“确定”。 4. 通过右键点击“Controller”文件夹>“添加”>“控制器”,然后选择“MVC 5 Controller - Empty”,然后点击“添加”,最后将其命名为“HomeController”。 5. 默认创建了一个名为“Index”的GET操作方法。
// GET: Home
public ActionResult Index()
{
return View();
}
public ActionResult Index()
{
using (ChannelFactory channelFactory = null)
{
try
{
// 创建服务暴露的类型的绑定
BasicHttpBinding binding = new BasicHttpBinding();
// 创建EndPoint地址
EndpointAddress endpointAddress = new EndpointAddress("http://localhost:50419/User.svc");
// 将绑定和EndPoint地址传递给ChannelFactory
channelFactory = new ChannelFactory(binding, endpointAddress);
// 现在创建新的通道如下
IUser channel = channelFactory.CreateChannel();
// 在此通道上调用服务方法如下
string result = channel.ReverseString("Suchit Khunt");
return View(result);
}
catch (TimeoutException)
{
// 超时错误
if (channelFactory != null)
channelFactory.Abort();
throw;
}
catch (FaultException)
{
if (channelFactory != null)
channelFactory.Abort();
throw;
}
catch (CommunicationException)
{
// 通信错误
if (channelFactory != null)
channelFactory.Abort();
throw;
}
catch (Exception)
{
if (channelFactory != null)
channelFactory.Abort();
throw;
}
}
}