麻烦,而连接我的WCF服务到ASP.NET Web Forms应用程序
本文关键字:NET ASP Web Forms 应用程序 服务 连接 我的 WCF 麻烦 | 更新日期: 2023-09-27 18:11:58
我有一个ASP。关于书店的。NET Web Forms应用程序。我已经创建了一个数据库,并包括一些书里面。我原来的ASP。NET应用程序工作得很好,我可以在我创建的books页面中查看我的书籍。在那个页面上,我可以看到他们的名字、拇指图像和价格,还有一个链接说"添加到购物车",当按下这个链接时,它会把书放入我创建的购物车中。
然后我创建了一个WCF服务,我想把我的图书目录作为一种服务。我将我的原始项目的.dll引用添加到我的WCF服务应用程序中,下面是我的服务中的文件,其中包含我想要实现的单个服务。
Catalog.svc.cs
public class Catalog : ICatalog
{
public IQueryable<Bookstore.Models.Book> GetBooks()
{
var _db = new Bookstore.Models.BookContext();
IQueryable<Book> query = _db.Books;
return query;
}
ICatalog.cs
[ServiceContract]
public interface ICatalog
{
[OperationContract]
IQueryable<Book> GetBooks();
}
然后我创建了第三个项目,另一个ASP。. NET Web Forms应用程序,我想在其中使用我以前创建的WCF项目,并在我当前的第三个ASP. NET中显示我的第一个项目的目录。网络项目。我创建了一个名为Catalog的新页面,希望在其中显示第一个项目中的图书。我已经添加了我以前的WCF服务的服务引用,并且还添加了我的第一个ASP的引用。dll文件。网络应用程序。下面是我在第三个项目中创建的Catalog文件的代码。请注意,.aspx文件与我的第一个项目。aspx文件完全相同,其中显示了我的书籍。请注意,在我的第三个项目的Catalog.aspx.cs文件中,如下所示,我已经为之前创建的WCF服务创建了一个新实例,并使用该方法来显示图书。
Catalog.aspx
<%@ Page Title="Books" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
CodeBehind="Catalog.aspx.cs" Inherits="BookstoreServiceImplementation.Catalog" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="FeaturedContent" runat="server">
<section class="featured">
<div class="content-wrapper">
<hgroup class="title">
<h1><%: Page.Title %></h1>
</hgroup>
<section class="featured">
<ul>
<asp:ListView ID="bookList" runat="server"
DataKeyNames="BookID"
GroupItemCount="3" ItemType="Bookstore.Models.Book" SelectMethod="GetBookData">
<EmptyDataTemplate>
<table id="Table1" runat="server">
<tr>
<td>No data was returned.</td>
</tr>
</table>
</EmptyDataTemplate>
<EmptyItemTemplate>
<td id="Td1" runat="server" />
</EmptyItemTemplate>
<GroupTemplate>
<tr ID="itemPlaceholderContainer" runat="server">
<td ID="itemPlaceholder" runat="server"></td>
</tr>
</GroupTemplate>
<ItemTemplate>
<td id="Td2" runat="server">
<table>
<tr>
<td> </td>
<td>
<a href="<%#: GetRouteUrl("BookByNameRoute", new {bookName = Item.BookName}) %>">
<image src='/Catalog/Images/Thumbs/<%#:Item.ImagePath%>'
width="75" height="100" border="1"/>
</a>
</td>
<td>
<a href="<%#: GetRouteUrl("BookByNameRoute", new {bookName = Item.BookName}) %>">
<%#:Item.BookName%>
</a>
<br />
<span class="BookPrice">
<b>Price: </b><%#:String.Format("{0:c}", Item.UnitPrice)%>
</span>
<br />
</td>
</tr>
</table>
</td>
</ItemTemplate>
<LayoutTemplate>
<table id="Table2" runat="server">
<tr id="Tr1" runat="server">
<td id="Td3" runat="server">
<table ID="groupPlaceholderContainer" runat="server">
<tr ID="groupPlaceholder" runat="server"></tr>
</table>
</td>
</tr>
<tr id="Tr2" runat="server"><td id="Td4" runat="server"></td></tr>
</table>
</LayoutTemplate>
</asp:ListView>
</ul>
</section>
</div>
</section>
</asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="MainContent" runat="server">
</asp:Content>
Catalog.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.ModelBinding;
using Bookstore.Models;
namespace BookstoreServiceImplementation
{
public partial class Catalog : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void GetBookData()
{
CatalogReference.CatalogClient catalog = new CatalogReference.CatalogClient();
catalog.GetBooks();
}
}
}
问题如下,当我打开运行第三个项目并进入Catalog页面时,我没有看到第一个项目中的图书,而是得到一条文本:"No data was returned"。如果有人能帮我解决这个问题,我将很高兴。
你好像把wcf服务和wcf数据服务搞混了。
标准的wcf服务不能返回一个真正可查询的IQueryable。本质上,它只是列出IQueryable(拉下数据库中的每一行),并将其作为集合发送到网络上。在您的客户端上,当您接收到一系列书籍时,您可以看到这一点的证据。
如果您希望能够使用IQueryable将过滤后的查询通过网络发送到服务器,则需要使用wcf数据服务。数据服务在客户端上使用IQueryable来向服务器生成rest请求,以传递您的查询意图。服务器接收任意查询并返回数据。参见http://msdn.microsoft.com/en-us/library/cc668792.aspx
我相信GetBookData不应该是空的,它应该返回一个IQueryable。试着
public IQueryable<Book> GetBookData()
{
CatalogReference.CatalogClient catalog = new CatalogReference.CatalogClient();
return catalog.GetBooks();
}