Dalerico Ответов: 1

Как преобразовать служебный код WCF в потоковую передачу mp3-файла?


Всем привет,

Недавно я создал музыкальное приложение wcf service c# для прослушивания и загрузки музыкальных треков для потребления данных для фронтального приложения потоковой передачи музыки Android. Все работает хорошо принять производительность ожидания музыкального запроса, чтобы закончить буферизацию всего трека с сервера, чтобы ответить обратно клиенту (Android-приложение).

Ниже приведен мой код, который я в настоящее время использую для восстановления музыкальных mp3-файлов для потоковой передачи. Проблема в том, что mp3 - файлы буферизуются, и я хочу, чтобы они могли транслироваться вместо этого. Может ли кто-нибудь помочь мне показать несколько примеров того, как я буду скрывать метод прокси-сервиса LoadTracksByAlbum(string AlbumID) в потоке. Ваша помощь будет с радостью оценена.

Примечание: свойство TrackUrl, которое является доступом через объект loadTracksbyAlbum, является единственным свойством, относящимся к физическому mp3-файлу. Свойство TrackUrl получает строковый путь из базы данных и ссылается на папку, содержащую mp3-файлы на сервере, которые будут использоваться для потоковой передачи музыки в интерфейсном приложении потоковой передачи музыки Android.

Что я уже пробовал:

Я еще ничего не пробовал программно в c#, но я настроил настройки в файле webconfig на Transfermode = "Streamed", максимальный размер и т. д. Это может в конечном счете позволить мне передавать больше данных, чем разрешенные фиксированные 64 КБ, но это не позволяет мне использовать классы потока, такие как FileStream,BinaryReader и члены, такие как CanSeek, CanRead. У меня нет идеала slightess, как бы я записал этот поток в свою текущую сервисную операцию LoadTracksByAlbum(string AlbumID). Может ли кто-нибудь помочь мне с несколькими примерами? Я очень ценю вашу помощь.

Мой контракт на передачу данных:
[DataMember] public string TrackUrl { get; set; }


Мой контракт на обслуживание:
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "GET", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, UriTemplate = "LoadTracksByAlbum/{AlbumID}")]
List<LoadAlbumTracks> LoadTracksByAlbum(string AlbumID);


Мой метод работы прокси-договор реализации:
public List<LoadAlbumTracks> LoadTracksByAlbum(string AlbumID)
        {
            List<LoadAlbumTracks> loadAlbumTracksList1 = new List<LoadAlbumTracks>();
            MusicDataContext tapesDataContext = new MusicDataContext();
            CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-US");
            tapesDataContext.CommandTimeout = 0;
            foreach (proc_TracksLoadByAlbumResult loadByAlbumResult in (IEnumerable<proc_TracksLoadByAlbumResult>)tapesDataContext.proc_TracksLoadByAlbum(new int?(Convert.ToInt32(AlbumID))))
            {
                List<LoadAlbumTracks> loadAlbumTracksList2 = loadAlbumTracksList1;
                LoadAlbumTracks loadAlbumTracks1 = new LoadAlbumTracks();
                loadAlbumTracks1.TrackID = loadByAlbumResult.TrackID;
                loadAlbumTracks1.TrackTitle = loadByAlbumResult.TrackTitle;
                loadAlbumTracks1.Artists = loadByAlbumResult.Atists;
                loadAlbumTracks1.DiscJockeyName = loadByAlbumResult.DiscJockeyName;
                loadAlbumTracks1.TrackDescription = loadByAlbumResult.TrackDescription;
                loadAlbumTracks1.TrackUrl = loadByAlbumResult.TrackUrl;
                loadAlbumTracks1.AlbumID = loadByAlbumResult.AlbumID ?? 0;
                loadAlbumTracks1.AlbumCoverPhotoUrl = loadByAlbumResult.AlbumCoverPhotoUrl;
                loadAlbumTracks1.AlbumName = loadByAlbumResult.AlbumName;
                loadAlbumTracks1.TotalStreams = loadByAlbumResult.TotalStreams;
                LoadAlbumTracks loadAlbumTracks2 = loadAlbumTracks1;
                loadAlbumTracks1.DownloadStatus = loadByAlbumResult.DownloadStatus; 
                bool? trackStatus = loadByAlbumResult.TrackStatus;
                int num = trackStatus.HasValue ? (trackStatus.GetValueOrDefault() ? 1 : 0) : 1;
                loadAlbumTracks2.TrackStatus = num != 0;
                loadAlbumTracks1.DjID = loadByAlbumResult.DjID ?? 0;
                loadAlbumTracks1.CreatedBy = loadByAlbumResult.CreatedBy ?? 0;
                loadAlbumTracks1.CreatedOn = !loadByAlbumResult.CreatedOn.HasValue ? "" : loadByAlbumResult.CreatedOn.Value.ToString("d", (IFormatProvider)cultureInfo);
                loadAlbumTracks1.UpdatedBy = loadByAlbumResult.UpdatedBy ?? 0;
                loadAlbumTracks1.UpdatedOn = !loadByAlbumResult.UpdatedOn.HasValue ? "" : loadByAlbumResult.UpdatedOn.Value.ToString("d", (IFormatProvider)cultureInfo);
                LoadAlbumTracks loadAlbumTracks3 = loadAlbumTracks1;
                loadAlbumTracksList2.Add(loadAlbumTracks3);
            }
            return loadAlbumTracksList1;
        }

1 Ответов

Рейтинг:
6

Dalerico

Ну, вскоре после публикации этого вопроса я зашел в тупик, чтобы найти свое собственное решение. Для тех, кто еще может иметь подобный вопрос, чтобы знать, как создать поток в службе REST wcf для запроса GET, вы можете посмотреть ниже и увидеть, где именно я имплементировал экземпляр MemoryStream, чтобы обернуть мои данные, поступающие из моего объекта списка (Generic), чтобы передать мои данные по проводу (сеть).

[OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "GET", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, UriTemplate = "LoadTracksByAlbum/{AlbumID}")]
        MemoryStream LoadTracksByAlbum(string AlbumID);


public MemoryStream LoadTracksByAlbum(string AlbumID)
        {
            List<LoadAlbumTracks> loadAlbumTracksList1 = new List<LoadAlbumTracks>();
            
            SlappinMixTapesDataContext tapesDataContext = new SlappinMixTapesDataContext();
            CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-US");
            tapesDataContext.CommandTimeout = 0;
            foreach (proc_TracksLoadByAlbumResult loadByAlbumResult in (IEnumerable<proc_TracksLoadByAlbumResult>)tapesDataContext.proc_TracksLoadByAlbum(new int?(Convert.ToInt32(AlbumID))))
            {
                List<LoadAlbumTracks> loadAlbumTracksList2 = loadAlbumTracksList1;
                LoadAlbumTracks loadAlbumTracks1 = new LoadAlbumTracks();
                loadAlbumTracks1.TrackID = loadByAlbumResult.TrackID;
                loadAlbumTracks1.TrackTitle = loadByAlbumResult.TrackTitle;
                loadAlbumTracks1.Artists = loadByAlbumResult.Atists;
                loadAlbumTracks1.DiscJockeyName = loadByAlbumResult.DiscJockeyName;
                loadAlbumTracks1.TrackDescription = loadByAlbumResult.TrackDescription;
                loadAlbumTracks1.TrackUrl = loadByAlbumResult.TrackUrl;
                loadAlbumTracks1.AlbumID = loadByAlbumResult.AlbumID ?? 0;
                loadAlbumTracks1.AlbumCoverPhotoUrl = loadByAlbumResult.AlbumCoverPhotoUrl;
                loadAlbumTracks1.AlbumName = loadByAlbumResult.AlbumName;
                loadAlbumTracks1.TotalStreams = loadByAlbumResult.TotalStreams;
                LoadAlbumTracks loadAlbumTracks2 = loadAlbumTracks1;
                bool? trackStatus = loadByAlbumResult.TrackStatus;
                int num = trackStatus.HasValue ? (trackStatus.GetValueOrDefault() ? 1 : 0) : 1;
                loadAlbumTracks2.TrackStatus = num != 0;
                loadAlbumTracks1.DjID = loadByAlbumResult.DjID ?? 0;
                loadAlbumTracks1.CreatedBy = loadByAlbumResult.CreatedBy ?? 0;
                loadAlbumTracks1.CreatedOn = !loadByAlbumResult.CreatedOn.HasValue ? "" : loadByAlbumResult.CreatedOn.Value.ToString("d", (IFormatProvider)cultureInfo);
                loadAlbumTracks1.UpdatedBy = loadByAlbumResult.UpdatedBy ?? 0;
                loadAlbumTracks1.UpdatedOn = !loadByAlbumResult.UpdatedOn.HasValue ? "" : loadByAlbumResult.UpdatedOn.Value.ToString("d", (IFormatProvider)cultureInfo);
                LoadAlbumTracks loadAlbumTracks3 = loadAlbumTracks1;
                loadAlbumTracksList2.Add(loadAlbumTracks3);
            }

            byte[] byteArray = new byte[4000];

            // Convert the Object to be serialized and return a JSON string.
            var json1 = new JavaScriptSerializer().Serialize(loadAlbumTracksList1);

            // Convert the string into bytes of array.
            byteArray = Encoding.UTF8.GetBytes(json1);

            MemoryStream stream = new MemoryStream(byteArray);
            stream.ToArray();
            return stream;
        }


И что еще более важно, чтобы завершить любой тип потока, вам нужно установить режим trasport в вашем файле webconfig на Streamed (двунаправленный) или на другие 2 варианта потока. Я надеюсь, что это полезно для других людей, которые не имеют знаний или каких-либо ссылок на то, как реализовать потоковый ответ на запрос клиента.