Как использовать HttpWebRequest для вызова операции веб-службы, которая принимает параметр byte []? - PullRequest
5 голосов
/ 01 апреля 2009

Я пытаюсь вызвать [webmethod] из C #. Я могу назвать простой веб-метод, который принимает параметры 'string'. Но у меня есть веб-метод, который принимает параметр 'byte []'. Я сталкиваюсь с '500 внутренняя ошибка сервера', когда я пытаюсь вызвать это. Вот пример того, что я делаю.

Допустим, мой метод такой

[WebMethod]
public string TestMethod(string a)
{
    return a;
}

Я называю это так, используя HttpRequest в C #

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Credentials = CredentialCache.DefaultCredentials;
            req.Method = "POST";
            // Set the content type of the data being posted.
            req.ContentType = "application/x-www-form-urlencoded";

            string inputData = "sample webservice";
            string postData = "a=" + inputData;
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] byte1 = encoding.GetBytes(postData);

            using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
            {
                StreamReader sr = new StreamReader(res.GetResponseStream());
                string txtOutput = sr.ReadToEnd();
                Console.WriteLine(sr.ReadToEnd());
            }

Это прекрасно работает. Теперь у меня есть другой веб-метод, который определен как это

[WebMethod]
public string UploadFile(byte[] data)

Я пытался назвать это так

            ASCIIEncoding encoding = new ASCIIEncoding();
            string postData = "data=abc";
            byte[] sendBytes = encoding.GetBytes(postData);
            req.ContentLength = sendBytes.Length;
            Stream newStream = req.GetRequestStream();
            newStream.Write(sendBytes, 0, sendBytes.Length);

Но это дает мне 500 внутреннюю ошибку: (

Ответы [ 4 ]

5 голосов
/ 16 января 2013

возможно, я сделал это сам

Сначала настройте Заголовок, это можно получить, если ваш веб-сервис может быть запущен через Интернет и отправив параметры. Я использую инструменты разработчика из Chrome. Самый простой способ - просмотреть описание веб-службы (т. Е. Http: //myweb.com/WS/MyWS.asmx? Op = Validation)

WebRequest request = WebRequest.Create(http://myweb.com/WS/MyWS.asmx?op=Validation);
request.Method = "POST";
((HttpWebRequest)request).UserAgent = ".NET Framework Example Client";
request.ContentType = "text/xml; charset=utf-8";
((HttpWebRequest)request).Referer = "http://myweb.com/WS/MyWS.asmx?op=Validation";
((HttpWebRequest)request).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
((HttpWebRequest)request).Host= "myweb.com";
 request.Headers.Add("SOAPAction","http://myweb.com/WS/Validation");

Тогда часть запроса

string message = "a=2";
string envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
        "<soap:Body><Validation xmlns=\"http://myweb.com/WS\"><data>@Data</data></Validation></soap:Body></soap:Envelope>";
string SOAPmessage = envelope.Replace("@Data",   System.Web.HttpUtility.HtmlEncode(message));
// The message must be converted to bytes, so it can be sent by the request
byte[] data = Encoding.UTF8.GetBytes(SOAPmessage);
request.ContentLength = data.Length;
request.Timeout = 20000;
Stream dataStream = request.GetRequestStream();
dataStream.Write(data, 0, data.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
Stream inputStream = response.GetResponseStream(); 

Теперь вы можете получить входящий поток из ответа

Не забудьте адаптировать конверт SOAP и параметры для отправки в соответствии с описанием, приведенным в подробностях страницы веб-службы (т.е. http: //myweb.com/WS/MyWS.asmx? Op = Validation).

3 голосов
/ 01 апреля 2009

Вы используете функцию HTTP POST / HTTP GET для подключения веб-службы ASP.NET вместо отправки фактического вызова веб-службы. Это механизм, который позволяет вам тестировать простые веб-сервисы, но на самом деле он не предназначен для использования в производственном приложении. Фактически, если вы перейдете к URL-адресу веб-службы, то обнаружите, что он не может даже отобразить тестовую форму ввода для этого типа параметра. Возможно, можно найти способ заставить его работать, но, честно говоря, вы должны просто использовать его так, как он предназначен, и сгенерировать прокси веб-службы.

В Visual Studio щелкните правой кнопкой мыши проект, содержащий клиентский код, и выберите Добавить службу или веб-ссылку. Затем введите URL-адрес веб-службы, и он сгенерирует прокси. Если вы используете WCF, это будет выглядеть примерно так:

// ServiceNameClient is just a sample name, the actual name of your client will vary.
string data = "abc";
byte[] dataAsBytes = Encoding.UTF8.GetBytes(data);
ServiceNameClient client = new ServiceNameClient();
client.UploadFile(dataAsBytes);

Надеюсь, это поможет.

0 голосов
/ 27 февраля 2017

string postData = "data = abc";

думаю, вы должны передать байтовый массив как массив, а не строку base64. например:

string postData = "data = 97 & data = 98 & data = 99"; // массив байтов для abc равен [97,98,99]

см. https://www.codeproject.com/Tips/457410/Xml-WebService-Array-Parameters

0 голосов
/ 01 апреля 2009

Вероятно, вам потребуется base64 для кодирования двоичных данных.

Но ошибка 500 - это ключ для просмотра журнала событий Windows и просмотра того, что произошло на стороне сервера.

...