Я пытаюсь реализовать службу REST с использованием WCF, который будет принимать параметры P1, P2, P3, P4 и передавать их в хранимую процедуру, которая выполнит запрос и вернет результаты.
У меня есть этот код на C # для услуги:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.ServiceModel.Activation;
using System.Data;
namespace RestServicePublishing
{
[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[ServiceContract]
public class RestService
{
[OperationContract]
[WebGet]
public List<Simulated_service_State> GetState(decimal P1, decimal P2, decimal P3, decimal P4)
{
using (ServiceDataContext db = new ServiceDataContext())
{
List<Simulated_service_State> states =
db.GetStateByLongLat(P1, P2, P3, P4).ToList();
db.SubmitChanges();
return states;
}
}
}
}
Simulated_Service_State
- это временная таблица, в которую я сохраняю результаты вызова хранимой процедуры. Когда я вызываю веб-сервис через браузер, я получаю следующую ошибку:
Ошибка запроса
Сервер обнаружил ошибку
обработка запроса. Исключение
сообщение 'Ссылка на объект не установлена
к экземпляру объекта. Увидеть
логи сервера для более подробной информации.
трассировка стека исключений:
в
RestServicePublishing.ServiceDataContext..ctor ()
в
C: .... \ RestServicePublishing \ Service.designer.cs: линия
39 в
RestServicePublishing.RestService.GetState (Decimal
P1, десятичный P2, десятичный P3, десятичный
P4) в
C: \ .... \ RestServicePublishing RestService.svc.cs: линия
42 at SyncInvokeGetState (Object,
Object [], Object []) в
System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (Объект
экземпляр, Object [] входы, Object [] &
выходы) в
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41 (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc &
rpc) в
System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean
isOperationContextSet)
!!!
URL-адрес, по которому я звоню, следующий:
http://localhost/RestServicePublishing/RestService.svc/GetState?P1=14&P2=13&P3=22&P4=55
Может кто-нибудь помочь мне понять, как работать с хранимыми процедурами и службой REST WCF? Как вернуть значения из временной таблицы клиенту?
Обновление
Мне не удалось опубликовать все эти данные в разделе комментариев, поэтому я публикую их здесь.
Это код, который я сейчас использую, но в результате я получаю 0, что означает, что мой запрос ничего не выбирает из таблицы:
public class RestService
{
[OperationContract]
[WebGet (ResponseFormat = WebMessageFormat.Xml)]
public string GetState(decimal P1, decimal P2, decimal P3, decimal P4)
{
IList<Simulated_service_State> query = new List<Simulated_service_State>();
IList<string> Mac = new List<string>();
int j;
int jj;
using (ServiceDataContext db = new ServiceDataContext())
{
query = db.GetStateByLongLat1(P1, P2, P3, P4).ToList();
db.SubmitChanges();
var query2 = from Simulated_service_State state in db.Simulated_service_States
select state.MAC;
Mac = query2.ToList();
jj = Mac.Count;
j = query.Count;
}
return j.ToString() + "," + jj.ToString();
}
}
Если я использую этот код (не хранимую процедуру), я получаю результат из таблицы, поэтому я предполагаю, что linq to sql работает нормально (ServiceDataContext):
public class RestService
{
[OperationContract]
[WebGet (ResponseFormat = WebMessageFormat.Xml)]
public string GetState(decimal P1, decimal P2, decimal P3, decimal P4)
{
IList<Simulated_service_State> query = new List<Simulated_service_State>();
IList<string> Mac = new List<string>();
int j;
int jj;
using (ServiceDataContext db = new ServiceDataContext())
{
var query3 = from SimulatedNode node in db.SimulatedNodes
select node.MAC;
Mac = query3.ToList();
j = (Mac.Count);
}
return j.ToString();
Результат, который я получаю, равен 4, что соответствует количеству записей в списке.
Есть идеи, как поступить?