Ошибка в разработке SQL Server для WCF - PullRequest
0 голосов
/ 10 декабря 2011

Я тестирую БД, в которой есть две таблицы (Спутниковая и Канальная) для показа по мере необходимости с помощью WCF.К счастью, я перепробовал все, что знаю, и в Интернете больше недели, и я не могу решить проблему.

Это контракт на обслуживание IService.cs

[ServiceContract]
public interface IService
{
    [OperationContract]
    List<Satalite> SelectSatalite(int satNum);

    [OperationContract]
    List<Satalite> SataliteList();

    [OperationContract]
    List<Channel> ChannelList(int satNum);

    [OperationContract]
    String Sat(int satNum);

}

И это файл Service.svc.cs

public class Service : IService
{
   DataDbDataContext DbObj = new DataDbDataContext();

   public List<Satalite> SataliteList()
   {
        var satList = from r in DbObj.Satalites
                      select r;

        return satList.ToList();
   }

    public List<Satalite> SelectSatalite(int satNum)
    {
        var satList = from r in DbObj.Satalites
                      where r.SateliteID == satNum
                      select r;

        return satList.ToList();
    }

    public List<Channel> ChannelList(int satNum)
    {
        var channels = from r in DbObj.Channels
                       where r.SateliteID == satNum
                       select r;

        return channels.ToList();
    }


    public String Sat(int satNum)
    {
        Satalite satObj = new Satalite();

        satObj = DbObj.Satalites.Single(p => p.SateliteID == satNum);
        return satObj.Name;
    }
} 

Всякий раз, когда я пытаюсь запустить первые три, я получилошибка при тестировании с использованием wcftestclient.exe, последнее работает без проблем.

Базовое соединение было закрыто: соединение было неожиданно закрыто.

Трассировка стека сервера:
в System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException webException, запрос HttpWebRequest, HttpAbortReason abortReason)
в System.ServiceModel.Cestnel * Http. Rehan..Channels.RequestChannel.Request (сообщение-сообщение, время ожидания TimeSpan)
в System.ServiceModel.Dispatcher.RequestChannelBinder.Request (сообщение-сообщение, время TimeSpan)
в System.ServiceModel.Channels.ServiceChannel.Call (действие String,Булево одностороннее, операция ProxyOperationRuntime, Object [] ins, Object [] outs, TimeSpan timeout)
в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (операция IMethodCallMessageCall, ProxyOperationRuntime)
в System.ServiceModel.Channels.ServiceChannelProessIn * 10 *)* Исключение выдается в [0]:
в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg)
в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData)тип) в IService.SelectSatalite (Int32 satNum)
в ServiceClient.SelectSatalite (Int32 satNum)

Внутреннее исключение: базовое соединение было закрыто: соединение было неожиданно закрыто.
в System.Net.HttpWebRequest.GetResponse ()
в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (тайм-аут TimeSpan)

что происходит из-за ошибки, которая понимается как ошибкаТаблицы БД, если бы я использовал известный типкомпилятором .net (напр.int или string) это будет работать без проблем.К счастью, я не нашел решения.

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Ошибка представляется одной из двух причин:

  1. a время ожидания , так как вы возвращаете слишком много данных, например, выбор данных избаза данных занимает слишком много времени, чтобы метод обслуживания завершился вовремя

    или:

  2. размер сообщения слишком большой потому что вы выбираете слишком много данных, и поэтому связь WCF прерывается до того, как будут возвращены все данные

Мое решение:

  • не выбирайте все данные из таблиц!Возвратите столько данных, сколько вы действительно можете обработать / отобразить, например, 10 строк, 20 строк или максимум 100 строк ...

Попробуйте - если вы измените свой метод на:

 public List<Satalite> SataliteList(int count)
 {
      var satList = (from r in DbObj.Satalites
                    select r).Take(count);

      return satList.ToList();
 }

Можете ли вы позвонить из тестового клиента WCF, например, count = 10 или count = 50 ??

0 голосов
/ 22 декабря 2011

Настройка параметров тайм-аута на стороне сервера и клиента поможет вам.

На стороне сервера настройте атрибут SendTimeout элемента привязки, а на стороне клиента настройте атрибут RecieveTimeout элемента привязки.

Спасибо

...