WCF服务以及asp.net中的LINQ to SQL

时间:2010-08-26 12:28:40

标签: linq wcf

我已在我的应用程序中创建了WCF服务,涉及LINQ Concepts但我无法理解如何将该服务调用到我的网页。任何人都可以告诉我如何通过详细步骤将我创建的服务调用到我的应用程序以及一些样本编码,以便我可以继续进行?在此先感谢。

1 个答案:

答案 0 :(得分:1)

这是我放在一起展示如何调用WCF RESTful服务的示例,该服务使用jQuery的$.ajax函数从基本网页返回LINQ的结果。无论您是从LINQ返回到对象还是从LINQ返回到SQL,基本概念应该是相同的 - 我使用基本的LINQ到对象来说明这一点。


以下是WCF服务( Service2.svc.cs ):

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class Service2
{
    public static List<string> myValues = new List<string>()
    {
        "Apple", "Orange", "Apricot", "Banana", "Grape", "Peach", "Plum"
    };

    [OperationContract]
    [WebGet(UriTemplate="Filter?q={filter}", 
        ResponseFormat=WebMessageFormat.Json)]
    public IEnumerable<string> FilterList(string filter)
    {
        var items = from v in myValues
                    where v.StartsWith(filter)
                    select v;

        return items;
    }

这是一个简单的服务,它使用LINQ只返回我的List<string>中以传入的字母开头的元素。所以如果你传入'P',你会得到“Peach”和“Plum”返回作为IEnumerable<string>

此服务设置为由于使用WebGet属性而从GET请求返回数据。这表示只能通过HTTP GET请求调用此方法。服务方法设置为以JSON格式返回数据(比XML更流线型,但不是可扩展的)。由于ResponseFormat=WebMessageFormat.Json属性的WebGet设置,因此设置方式相同。

当我从我的应用程序(或浏览器!)调用此方法并为我的filter参数传递字母“P”时,我对客户端的响应是这样的(通过Fiddler):
["Peach","Plum"]

这是一个返回的简单的JSON注释数组。然后,我可以使用此返回的数据执行任何操作。

另请注意,我没有必要将IEnumberable<string>转换为JSON格式--WCF的内置JSON序列化程序为我做了这一点。

编辑:您可以使用LINQ-to-SQL查询替换我的简单LINQ到对象,它将与其他所有内容保持不变:

public IEnumerable<string> FilterList(string filter)
{
    DbTest1DataContext context = new DbTest1DataContext();
    var names = from n in context.Attendees
                where n.Name.StartsWith(filter)
                select n.Name;

    return names;
}

我的DbTest1DataContext是我的LINQ-to-SQL上下文,指向一个数据库,该数据库有一个带有Name列的Attendees表。此答案中的其他所有内容保持不变(web.config,HTML,jQuery等)。


这是我的服务的web.config( web.config ):

  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WcfRestService1.Service2AspNetAjaxBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="WcfRestService1.Service2">
        <endpoint address="" behaviorConfiguration="WcfRestService1.Service2AspNetAjaxBehavior"
          binding="webHttpBinding" contract="WcfRestService1.Service2" />
      </service>
    </services>
  </system.serviceModel>

这是非常标准的,开箱即用的配置,除了我设置使用webHttp的端点行为。


这是我的客户端代码( TestService.htm ):

<html>
    <head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>    
    <script type="text/javascript">
        $(document).ready(function () {
            $("#sendit").click(function (e) {
                e.preventDefault();
                $.ajax({
                    url: "Service2.svc/Filter",
                    data: { q: $("#source").val() },
                    type: "GET",
                    dataType: "json",
                    success: function (data) {
                        var theResults = $("#results");
                        theResults.empty();
                        $.each(data, function (i, item) {
                            theResults.append("<li>" + item + "</li>");
                        });
                    },
                    error: function (x, t, m) { alert(t + " :: " + m); }
                });
            });
        });
    </script>
    </head>
    <body>
        <div>
            Starts with: <input id="source" type="text" />
            <button id="sendit">Send It</button>
        </div>
        <div>
            <ul id="results">
            </ul>
        </div>
    </body>
</html>

这是一个非常简单的页面,它接受来自文本框(id = source)的输入,并且在您单击按钮(id = sendit)之后,它将调用我的WCF RESTful服务。我正在使用jQuery,但你可以看到我在$.ajax调用(data: { q: $("#source").val() })的data属性中传递了我的过滤器值,我将其设置为GET请求(type: "GET"),因为这就是我配置服务的方式。我希望得到的数据类型是JSON(dataType: "json")。如果我的服务调用成功,我会调用我的成功处理程序,然后只将返回的字符串添加到<ul>元素。

希望这为从LINQ查询中检索一组值并将其发送到基于Web的客户端提供了一个很好的起点。如果有更多问题,请告诉我,我会相应地更新我的答案。

希望这有帮助!