如何在ASP.Net MVC应用程序中访问WCF服务?

时间:2013-05-14 09:08:47

标签: wcf asp.net-mvc-4

我对访问WCF的方式有疑问。我构建了一个安全的WCF服务,从数据库返回数据,它工作正常。现在我需要通过MVC访问这个Web服务(我对它没有足够的了解)。

我在Stack Overflow上查了类似的问题,但是我找不到我需要的东西。我遵循了这个link,但正如我所说,WCF从SQL返回数据,我用SQL连接我的WCF,当我使用这个例子时,我没有得到预期的结果。

我在MVC中调用的操作,它从SQL返回数据集类型

[OperationContract]
DataSet GetAllbooks(string Title)

在MVC的Homecontrller中写道

ServiceReference1.Service1Client obj = new ServiceReference1.Service1Client();
public ActionResult Index()
{
    DataSet ds = obj.GetAllbooks();
    ViewBag.AuthorList = ds.Tables[0];
    return View();
}

并且在视图中我写了

     @{
    ViewBag.Title = "AuthorList";
   }
    <table>
    <tr><td>ISBN</td><td>Author</td><td>Price</td></tr>
   <%foreach (System.Data.DataRow dr in ViewBag.AuthorList.Rows)
  {%>
  <tr>
   <td><%=dr["ISBN"].ToString()%></td>         
     <td><%=dr["Author"].ToString() %></td>
   <td><%=dr["Price"].ToString() %></td>
</tr>         
  <% } %>
 </table>

我没有得到任何结果

此外,WCF提供的某些服务需要接受来自用户的输入我是如何做到的

谢谢。

1 个答案:

答案 0 :(得分:6)

这是一个非常基本的问题,但一般来说,您可以在主Web.Config文件中添加Web服务引用和端点信息,但我怀疑您在调用WCF服务URL时遇到问题,如果是这样,我发布了一个示例用于在MVC应用程序中调用WCF Web服务的通用类/包装器。

将Web引用添加到Visual Studio 2012:

  1. 在解决方案资源管理器中右键单击项目
  2. 选择添加 - >服务参考 - &gt;然后单击高级按钮... - &gt;
  3. 然后点击&#34;添加网络参考...&#34;按钮 - &gt;然后在URL框中键入Web服务的地址。然后单击绿色箭头,Visual Studio将发现您的Web服务并显示它们。
  4. 您可能已经知道上述内容,可能只需要一个通用的包装类,这使得在MVC中轻松调用WCF Web服务。我发现使用泛型类效果很好。我不能相信它;在互联网上找到它并且没有归属。在http://www.displacedguy.com/tech/powerbuilder-125-wcf-web-services-asp-net-p3有一个可下载源代码的完整示例,它调用使用PowerBuilder 12.5.Net创建的WCF Web服务,但无论是否创建,在MVC中调用WCF Web服务的过程都是相同的。在Visual Studio或PowerBuilder中。

    以下是在ASP.NET MVC中调用WCF Web服务的通用包装类的代码

    当然,在我的不完整示例之后,不要为错误处理建模...

    using System;
    using System.ServiceModel;
    namespace LinkDBMvc.Controllers
    {
       public class WebService<T> 
       {
         public static void Use(Action<T> action)  
         {
           ChannelFactory<T> factory = new ChannelFactory<T>("*");
           T client = factory.CreateChannel();
           bool success = false;
           try
           {
              action(client);
              ((IClientChannel)client).Close();
              factory.Close();
              success = true;
           }
           catch (EndpointNotFoundException e)
           {
              LinkDBMvc.AppViewPage.apperror.LogError("WebService", e, "Check that the Web Service is running");
           }
           catch (CommunicationException e)
           {
              LinkDBMvc.AppViewPage.apperror.LogError("WebService", e, "Check that the Web Service is running");
           }
           catch (TimeoutException e)
           {
              LinkDBMvc.AppViewPage.apperror.LogError("WebService", e, "Check that the Web Service is running");
           }
           catch (Exception e)
           {
              LinkDBMvc.AppViewPage.apperror.LogError("WebService", e, "Check that the Web Service is running");
           }
           finally
           {
             if (!success)
             {
               // abort the channel
               ((IClientChannel)client).Abort();
               factory.Abort();
             }
           }
         }
       }
     }