Member 10359492 Ответов: 2

вызов веб-сервиса без добавления веб-ссылки


Здравствуйте разработчики,

Я работаю на сайте, где я загружаю изображение с именем, и этот загруженный файл должен храниться на другом сайте. www.abc.com это нужно хранить внутри www.xyz.com файловая система. Короче говоря, это междоменная проблема, над которой я работаю.
я использовал веб-сервис с параметром querysting для достижения этой цели, но querysting имеет ограничение, поэтому всякий раз, когда я отправляю изображение bytearray, он не может отправить все изображение из-за его ограничения.
мне нужен другой способ решить эту проблему, пожалуйста, предложите мне способ решить эту проблему.

одна важная вещь здесь я не могу добавить webreference, потому что одно и то же решение имеет несколько выходных instatnces, поэтому я использую веб-сервис без какой-либо ссылки, добавленной в мое решение. Еще одна вещь, не предлагайте мне использовать вызов ftp-клиента, потому что он принимает creadential, который я не могу использовать.

мне нужна структура метода webservice, которая принимает два параметра и код, вызывающий этот webmethod и передающий эти два параметра без добавления каких-либо ссылок.


пожалуйста, помогите мне.

мой код таков :
[webmethod]

public int StoreImage()
        {
            try
            {
                if (System.Web.HttpContext.Current.Request.QueryString["filename"] != null && System.Web.HttpContext.Current.Request.QueryString["imgByte"] != null)
                {
                    Byte[] imgbyte = Encoding.ASCII.GetBytes(System.Web.HttpContext.Current.Request.QueryString["imgByte"].ToString());
                    System.IO.File.WriteAllBytes(Server.MapPath("\\images\\BannerImages\\") + System.Web.HttpContext.Current.Request.QueryString["filename"].ToString(), imgbyte);
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
            catch
            {
                return 0;
            }
        }

[page code that call my webmethod]

string filename = fileuploader1.FileName;
            Byte[] imgByte = null;
            if (fileuploader1.HasFile && fileuploader1.PostedFile != null)
            {
                //To create a PostedFile
                HttpPostedFile File = fileuploader1.PostedFile;
                //Create byte Array with file len
                imgByte = new Byte[File.ContentLength];
                //force the control to load data in array
                File.InputStream.Read(imgByte, 0, File.ContentLength);
            }

            string ServeurURL = "http://xyz/SaveBannerImages.asmx/StoreImage?filename=" + filename + "&imgByte=" + imgByte;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ServeurURL);
            request.ContentType = "text/xml";
            request.Method = "POST";

            using (System.IO.Stream stream = request.GetRequestStream())
            {
                byte[] arrBytes = imgByte;
                stream.Write(arrBytes, 0, arrBytes.Length);
            }

            // Get the response
            WebResponse response = null;
            try
            {
                response = request.GetResponse();
                using (Stream stream = response.GetResponseStream())
                {
                    using (StreamReader rdr = new StreamReader(stream, System.Text.Encoding.UTF8))
                    {
                        // Deserialize the response
                        string strResponse = rdr.ReadToEnd();
                        idmsg.Text = strResponse;
                    }
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                    response = null;
                }
            }


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

2 Ответов

Рейтинг:
18

Mahesh Bailwal

Я думаю, что основная проблема, с которой вы столкнулись здесь, заключается в том, что вы хотите использовать веб-сервис, но не хотите добавлять веб-ссылку, которая является совершенно правильной.Ну, я никогда не буду рекомендовать какому-либо органу потреблять веб-сервис, добавляя веб-ссылку, а в профессиональном слове для потребления веб-сервиса вам нужно выполнить следующие шаги упоминания.

1. Создайте прокси-сервер для веб-службы с помощью WSDL.exe (Инструмент Языка Описания Веб-Служб [^])

2. Добавьте прокси-файл в свой проект, где вы хотите использовать веб-сервис.

3. сохраните url-адрес веб-службы в файле web.config/app.config и передайте его в качестве параметра конструктору прокси-класса. Таким образом, вы можете изменить местоположение веб-службы без внесения изменений в код.

Приведенная ниже ссылка может дать вам лучшее понимание

Создание клиентов веб-служб с использованием платформы .NET Framework[^]

Для загрузки изображения вы можете проверить следующие ссылки

загрузка изображения в веб-сервис с помощью c#[^]

Загрузка любого типа файлов через веб-службу C# [^]


Member 10359492

спасибо, что потратили свое драгоценное время, чтобы помочь мне. но, как я четко упоминаю в своем сообщении, я не могу использовать прокси-класс / веб-ссылку в своем решении. Смотрите, я разрабатываю панель администратора, которая обрабатывает содержимое и документы для других 6 веб-сайтов. поэтому всякий раз, когда я загружаю изображение / документ через панель администратора, это изображение / документ необходимо сохранить в файловой системе соответствующего сайта, который я выбираю для загрузки из своей панели администратора. поэтому, насколько мне известно, не рекомендуется добавлять веб-ссылку или прокси для каждого веб-сайта в одном решении (панель администратора). вот почему мне нужно решение, в котором я могу динамически выбирать веб-службу для работы. Надеюсь, вы понимаете мою проблему и скоро поможете мне. еще раз спасибо.

Mahesh Bailwal

ну, в этом случае вы можете динамически изменять url-адрес веб-сервиса в зависимости от того, на какой сайт вы хотите загрузить файл.
Как я уже упоминал выше, вы можете передать url-адрес веб-службы в качестве параметра конструктору прокси-класса.

Member 10359492

спасибо сэр что помогли мне это сработало

Mahesh Bailwal

добро пожаловать :) не могли бы Вы отметить этот вопрос решенным

Рейтинг:
12

Zoltán Zörgő

Как вы, вероятно, заметили, даже Visual Studio имеет встроенную функцию для использования любого вида веб-сервиса. Совершенно очевидно, что для них не существует определенной веб-ссылки. Технология, которую вы должны рассмотреть, - это WSDL. Таким образом, вы либо создаете прокси статически, как предложил Махеш Бейлвал (см. Этот учебник: http://dotnetslackers.com/Community/blogs/kaushalparik/archive/2010/05/14/how-to-call-invoke-a-web-service-without-adding-web-reference.aspx[^]), или вы идете еще дальше и получаете фреймворк, динамически создающий прокси во время выполнения (см.: Вызов веб-сервиса динамично и прочитать определение веб-сервиса [^Этот более поздний метод полезен, когда вы должны иметь возможность потреблять неизвестные (или недостаточно известные) услуги во время разработки.


Member 10359492

спасибо, что потратили свое драгоценное время, чтобы помочь мне. но, как я четко упоминаю в своем сообщении, я не могу использовать прокси-класс / веб-ссылку в своем решении. Смотрите, я разрабатываю панель администратора, которая обрабатывает содержимое и документы для других 6 веб-сайтов. поэтому всякий раз, когда я загружаю изображение / документ через панель администратора, это изображение / документ необходимо сохранить в файловой системе соответствующего сайта, который я выбираю для загрузки из своей панели администратора. поэтому, насколько мне известно, не рекомендуется добавлять веб-ссылку или прокси для каждого веб-сайта в одном решении (панель администратора). вот почему мне нужно решение, в котором я могу динамически выбирать веб-службу для работы. Надеюсь, вы понимаете мою проблему и скоро поможете мне. еще раз спасибо.

Zoltán Zörgő

Не копируйте-вставляйте комментарии, читайте ответ правильно. Как вы могли видеть по второй ссылке, которую я разместил, здесь нет жестко закодированной ссылки или прокси-сервера. Это делается во время выполнения. Кстати, вызов веб-сервиса - это всего лишь http-транзакция. Таким образом, его можно имитировать на более низком уровне, если это необходимо. Еще одна технология, о которой вы должны знать, - это UDDI.

Member 10359492

большое вам спасибо, сэр, это сработало. еще раз благодарю вас...