无需代理直接访问WCF服务的ASP.NET MVC应用

在开发过程中,经常需要在ASP.NET MVC应用程序中访问WCF服务。通常情况下,会通过添加服务引用或生成代理类来实现这一点。但是,这种方式可能会增加项目复杂度,并且难以管理。本文将介绍一种更简洁的方法,即使用代码直接访问WCF服务,而无需添加代理或服务引用。

步骤1:创建共享库

首先,需要将服务契约和数据契约放入一个共享库(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); }

步骤2:添加新项目到解决方案资源管理器

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; } } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485