WCF REST WebServiceHostFactory с использованием linq to sql - PullRequest
0 голосов
/ 06 марта 2011

Я пытаюсь реализовать службу 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, что соответствует количеству записей в списке.

Есть идеи, как поступить?

Ответы [ 2 ]

0 голосов
/ 08 марта 2011

Я отказался от выполнения запроса с хранимой процедурой, поэтому я использовал стандартную функцию SQL-запроса, которая работает и предоставляет результаты.Вот окончательный код:

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
{
[AspNetCompatibilityRequirements(RequirementsMode =     AspNetCompatibilityRequirementsMode.Allowed)]
[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[ServiceContract]

public class RestService
{

    [OperationContract]
    [WebGet (ResponseFormat = WebMessageFormat.Json)]
    public List<Last_status_by_LongLat> GetState(decimal P1, decimal P2, decimal P3, decimal P4)
    {
        List<Last_status_by_LongLat> Mac = new List<Last_status_by_LongLat>();

        using (ServiceDataContext db = new ServiceDataContext())
        {
            var query = from view node in db.views
                         where table.param > P1 && table.param2 < P2 && table.param2 > P3 && table.param < P4
                         select table;
            Mac = query.ToList();


        }
        return Mac;

    }
}
}

Я передаю параметры P1 - P4 в инструкцию "where" вызова sql, а затем передаю запрос переменной в "List Mac", который представляетSQL-представление как linq to sql.В конце я возвращаю содержимое списка в вызов GetState WebGet.

0 голосов
/ 07 марта 2011

Я думаю, GetStateByLongLat () возвращает ноль.Затем ToList () выдаст «Ссылку на объект, не установленную для экземпляра объекта».ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...