powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Проблема с подключением WindowsPhone 8 и SQL Server через WCF.
2 сообщений из 2, страница 1 из 1
Проблема с подключением WindowsPhone 8 и SQL Server через WCF.
    #38629075
Zakary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот какая ситуация:
1.Есть WCFсервис в котором созданы Linq to SQL классы и методы для ввода/вывода данных из БД (MS SQL 2012 Express), сам сервис размещен на фришном ASP-хостинге.
2.В БД есть таблицы Users (описывает пользователя (id_user, login,password)), Songs(описывает песню (id_song,song_name)) и UsersSongs(описывает какой пользователь какую песню слушает, таблица, которая связывает Users и Songs (id_user,id_song)), связаны они между собой через CONSTAINT FOREIGN KEY по айдишникам.
3.Есть простое приложение на винфоне, к которому ссылкой подключен этот WCF сервис, в нем листбокс, в который подгружаются данные из таблицы Users.

Суть проблемы. Когда я заполняю какими-то данными таблицы Users или Songs - все нормально, приложение на винфоне нормально подгружает WCFсервис и через него получает данные из БД, но стоит мне ввести какие-нибудь данные в UsersSongs, то при попытке вызвать любой метод работы с БД - вылетает ошибка:
An exception of type 'System.ServiceModel.CommunicationException' occurred in System.ServiceModel.ni.dll but was not handled in user code.
Additional information: The remote server returned an error: NotFound.
Когда данных в UsersSongs нет - все работает.

Вот код WCF-сервиса:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  public class MusicService : IMusicService
    {
        DataClassesDataContext Data { get; set; }
        public MusicService()
        {
            Data = new DataClassesDataContext();
        }
        public List<User> GetUser(string login)
        {
            var q = from a in Data.Users where a.login==login select a;
            return q.ToList();
        
    }



Код WinPhone приложения:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            MusicServiceClient serviceClient = new MusicServiceClient();
            serviceClient.GetUserCompleted += serviceClient_GetUserCompleted;
            serviceClient.GetUserAsync(login.Text);
        }

        void serviceClient_GetUserCompleted(object sender, GetUserCompletedEventArgs e)
        {
            if (e.Result != null)
            { 
                listbox1.ItemsSource = e.Result;
            }
        }
    }



Ну и на всякий пожарный - кусок XAMLа:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    <phone:PhoneApplicationPage.Resources>
        <DataTemplate x:Key="TestDataTemplate">
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="10" Text="{Binding login}"></TextBlock>
                <TextBlock Margin="10" Text="{Binding password}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </phone:PhoneApplicationPage.Resources>

<ListBox Grid.Row="0" ItemsSource="{Binding}" ItemTemplate="{StaticResource TestDataTemplate}" Height="Auto" Width="400" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="10,10,0,0" Name="listbox1"></ListBox>



Вот еще SQL-код, что бы было понятнее.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create table Users
(
id_user integer IDENTITY(1,1) primary key,
login varchar (200) unique not null,
password varchar(200) unique not null
);

create table Songs
(
id_song integer IDENTITY(1,1) primary key,
song_name varchar(200) not null,
CONSTRAINT uc_SongID UNIQUE (id_song,song_name)
);

create table UsersSongs
(
id_user integer,
id_song integer,
CONSTRAINT pk_userssongs PRIMARY KEY (id_user,id_song),
CONSTRAINT fk_us_users FOREIGN KEY (id_user)
REFERENCES Users(id_user),
CONSTRAINT fk_us_songs FOREIGN KEY (id_song)
REFERENCES Songs(id_song)
);
...
Рейтинг: 0 / 0
Проблема с подключением WindowsPhone 8 и SQL Server через WCF.
    #38633061
МихаилР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zakary,

С большой вероятностью, к Windows Phone ваша проблема отношения никакого не имеет.
Я не работал конкртено с LinqToSQL (кстати, а почему именно этот Framework - он уже давно признан deprecated и не развивается?), но думаю, общий подход там такой же как в Entity Framework и NHibernate - для загрузки связанных сущностей создаются proxy-классы (обычно "на лету" в runtime) которые и отвечают за подгрузку связанных сущностей. WCF про этот класс не знает и не может его сериализовать (а может он и несериализуемый).

Подозреваю, что выглядит все так: когда вы заполняете порознь пользователей и музыку, то связи нет и поле отвечающее за связь получает значение Null. Проблем c сериализацией нет. Но как только появляется запись в таблице-связке, в поле для связи присваивается класс-proxy и WCF спотыкается на его сериализации.

Для того чтобы точно узнать, в чем проблема - включите трассировку на стороне сервиса .

Другой момент, что если выяснится, что я прав и дело в этом хитром классе, то не факт, что вы сможете легко и просто разрешить проблему. В частности, для решения такого рода задач часто используют Data Contract Surrogates , но в большинстве случаев используют и на стороне сервиса, и на стороне клиента. А вот поддерживает ли версия WCF для WP8 суррогаты - это большой вопрос.

Впрочем, для начала давайте-таки установим причину происходящего (см. трейсинг)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Проблема с подключением WindowsPhone 8 и SQL Server через WCF.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]