Вот пример, который я собрал, чтобы показать, как вызвать службу WCF RESTful, которая возвращает результат из LINQ с базовой веб-страницы с помощью функции $.ajax
jQuery.Независимо от того, возвращаетесь ли вы из LINQ к объектам или из LINQ в SQL, базовая концепция должна быть одинаковой - я использую базовый LINQ-to-object только для иллюстрации сути.
Вот служба 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>
.
Этот сервис настроен на возврат данных из запроса GET из-за использованияатрибута WebGet
.Это указывает на то, что этот метод может быть вызван только через HTTP-запрос GET.Сервисный метод настроен на возврат данных в формате JSON (который более упорядочен по потоку, чем XML, но не так расширяем).Он настроен таким образом из-за настройки ResponseFormat=WebMessageFormat.Json
для атрибута WebGet
.
Когда я вызываю этот метод из своего приложения (или из браузера!) И передаю букву «P» для параметра фильтра, мой ответ клиенту такой (через Fiddler):["Peach","Plum"]
Это простой JSON-нотный массив, который возвращается.Затем я могу использовать эти возвращенные данные, чтобы сделать что угодно.
Также обратите внимание, что мне не нужно было преобразовывать IEnumberable<string>
в формат JSON - встроенный сериализатор JSON WCF сделал это для меня.
РЕДАКТИРОВАТЬ: Вы можете заменить мой простой LINQ-to-objects на запрос LINQ-to-SQL, и он будет работать со всем остальным без изменений:
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;
}
My DbTest1DataContext
- это мой контекст LINQ-to-SQL, указывающий на базу данных, в которой есть таблица Attendees со столбцом Name.Все остальное в этом ответе остается неизменным (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 для этого, но вы можете видеть, что я передаю значение моего фильтра в свойстве data вызова $.ajax
(data: { q: $("#source").val() }
), я устанавливаю это как запрос GET (type: "GET"
), потому что именно так я настроил сервис.Тип данных, который я ожидаю получить обратно, - JSON (dataType: "json"
).И если мой сервисный вызов успешен, я вызываю свой обработчик успеха, который затем просто добавляет возвращенные строки к элементу <ul>
.
Надеюсь, это даст вам хорошую отправную точку для получения набора значений изЗапрос LINQ и отправка его веб-клиенту.Пожалуйста, дайте мне знать, если есть еще вопросы, и я обновлю свой ответ соответственно.
Надеюсь, это поможет!