package ru.curs.showcase.util;
import java.io.*;
import java.util.*;
import javax.servlet.http.*;
import org.slf4j.*;
import ru.curs.showcase.app.api.event.CompositeContext;
import ru.curs.showcase.runtime.AppInfoSingleton;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader;
/**
* Вспомогательные функции для работы с сервлетами.
*
* @author den
*
*/
public final class ServletUtils {
private static final String CANT_WRITE_RESPONSE_ERROR =
«Невозможно вернуть ошибку в HTTP response»;
/**
* Идентификатор сессии для модульных тестов.
*/
public static final String TEST_SESSION = «testSession»;
private static final Logger LOGGER = LoggerFactory.getLogger(ServletUtils.class);
private ServletUtils() {
throw new UnsupportedOperationException();
}
/**
* Подготавливает карту с параметрами URL. При подготовке учитывается то,
* что русские параметры URL считываются сервером в кодировке ISO-8859-1 при
* том, что в реальности они приходят либо в UTF-8 либо в СP1251, а также
* тот факт, что установка req.setCharacterEncoding(«ISO-8859-1») не
* помогает для параметров из URL (хотя помогает для параметров HTML формы).
*
* @param req
* — http запрос.
*/
public static SortedMap<String, List<String>>
prepareURLParamsMap(final HttpServletRequest req) throws UnsupportedEncodingException {
SortedMap<String, List<String>> result = new TreeMap<>();
@SuppressWarnings(«unchecked»)
Iterator<String> iterator = req.getParameterMap().keySet().iterator();
while (iterator.hasNext()) {
String oldKey = iterator.next();
String key = checkAndRecodeURLParam(oldKey);
String[] oldValues = (String[]) req.getParameterMap().get(oldKey);
ArrayList<String> values = new ArrayList<>();
for (int i = 0; i < oldValues.length; i++) {
values.add(checkAndRecodeURLParam(oldValues[i]));
}
result.put(key, values);
}
return result;
}
public static CompositeContext prepareURLParamsContext(final HttpServletRequest request)
throws UnsupportedEncodingException {
Map<String, List<String>> params = ServletUtils.prepareURLParamsMap(request);
return new CompositeContext(params);
}
/**
* Стандартный обработчик ошибки в сервлете.
*
* @param response
* — ответ.
* @param message
* — сообщение об ошибке.
* @param needOKStatus
* — указание на то, что статус ответа должен быть OK, несмотря
* на ошибку.
* @throws IOException
*/
public static void fillErrorResponce(final HttpServletResponse response, final String message,
final boolean needOKStatus) throws IOException {
if (!response.isCommitted()) {
response.reset();
doNoCasheResponse(response);
if (needOKStatus) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
makeResponseFromString(response, message);
} else {
if (AppInfoSingleton.getAppInfo().isEnableLogLevelWarning()) {
LOGGER.warn(CANT_WRITE_RESPONSE_ERROR);
}
}
}
/**
* Стандартная функция для записи ответа сервера из переданной строки. Код
* статуса должен быть установлен до вызова этой функции, т.к. она закрывает
* поток записи ответа.
*
* @param response
* — объект ответа сервера.
* @param message
* — текст для записи в тело ответа.
* @throws IOException
*/
public static void makeResponseFromString(final HttpServletResponse response,
final String message) throws IOException {
response.setContentType(«text/html»);
makeStdResponse(response, message);
}
public static void makeXMLResponseFromString(final HttpServletResponse response,
final String message) throws IOException {
response.setContentType(«text/xml»);
makeStdResponse(response, message);
}
protected static void
makeStdResponse(final HttpServletResponse response, final String message)
throws IOException {
response.setCharacterEncoding(TextUtils.DEF_ENCODING);
try (PrintWriter writer = response.getWriter()) {
writer.append(message);
}
}
/**
* Определяет, является ли браузер пользователя «старой версией IE».
* «Старыми» считаются 6 и 7 IE.
*
* @param request
* — HttpServletRequest.
* @return — результат проверки.
*/
public static boolean isOldIE(final HttpServletRequest request) {
String userAgent = getUserAgent(request);
boolean isOldIE =
(userAgent.indexOf(«msie 6.0») != —1) || (userAgent.indexOf(«msie 7.0») != —1);
return isOldIE;
}
public static String getUserAgent(final HttpServletRequest request) {
return request.getHeader(«User-Agent»).toLowerCase();
}
/**
* Возвращает содержимое реквеста в виде строки. Применяется для обработки
* submission с X-форм.
*
* @param request
* реквест
* @return — строку с содержимым.
*/
public static String getRequestAsString(final HttpServletRequest request)
throws java.io.IOException {
InputStream is = request.getInputStream();
return TextUtils.streamToString(is);
// String line;
//
// try (BufferedReader requestData =
// new BufferedReader(new InputStreamReader(is,
// TextUtils.DEF_ENCODING))) {
// StringBuffer stringBuffer = new StringBuffer();
// while ((line = requestData.readLine()) != null) {
// stringBuffer.append(line);
// }
// line = stringBuffer.toString();
// }
// return line;
}
/**
* Функция устанавливает у response сервера атрибуты, предотвращающие
* кэширование результатов запроса в различных браузерах и прокси-серверах.
*
* @param resp
* — response (ответ сервера).
*/
public static void doNoCasheResponse(final HttpServletResponse resp) {
resp.setHeader(«Pragma», «no-cache»);
resp.setHeader(«Cache-Control», «must-revalidate,no-store,no-cache»);
resp.setDateHeader(«Expires», 0);
}
/**
* Проверяет параметр на неверную кодировку ANSIISO вместо UTF8 и
* исправляет ее при необходимости.
*
* @param param
* — параметр.
* @return — правильно кодированный параметр.
* @throws UnsupportedEncodingException
*/
public static String checkAndRecodeURLParam(final String param)
throws UnsupportedEncodingException {
String enc = UTF8Checker.getRealEncoding(param);
if (!TextUtils.DEF_ENCODING.equals(enc)) {
return TextUtils.recode(param, enc, TextUtils.DEF_ENCODING);
}
return param;
}
/**
* Функция десериализации объекта, переданного в теле запроса.
*
* @param data
* — строка с urlencoded объектом.
* @return — объект.
* @throws SerializationException
*/
public static Object deserializeObject(final String data) throws SerializationException {
ServerSerializationStreamReader streamReader =
new ServerSerializationStreamReader(Thread.currentThread().getContextClassLoader(),
null);
streamReader.prepareToRead(data);
return streamReader.readObject();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 |
<?xml version="1.0" encoding="UTF-8"?> <report> <eeprom version="ENHANCED PBB/ЂB cor/dens v10.12" datetime=""></eeprom> <sn>015.15.01.002</sn> <file path="internalanalog.tar" type="tar"> <point> <x>-11,0000000</x> <y>1,6000000</y> </point> <point> <x>-0,0500000</x> <y>0,0000000</y> </point> </file> <file path="externaldensity.cor" type="cor"> <surface> <a0>94,5305710</a0> <a1>-0,0142365</a1> <a2>-0,0043975</a2> <a11>-0,0000980</a11> <a22>0,0001461</a22> <a12>-0,0000220</a12> <p>1,0000000</p> </surface> <surface> <a0>-266,8311768</a0> <a1>-3,8060381</a1> <a2>1,8994861</a2> <a11>0,0000000</a11> <a22>0,0000000</a22> <a12>0,0000000</a12> <p>3,0000000</p> </surface> <surface> <a0>0,0000000</a0> <a1>0,0000000</a1> <a2>0,0000000</a2> <a11>-0,0004314</a11> <a22>0,0000001</a22> <a12>0,0000000</a12> <p>6,0000000</p> </surface> <surface> <a0>-13,4954958</a0> <a1>0,0428321</a1> <a2>-0,0312684</a2> <a11>0,0000000</a11> <a22>0,0000000</a22> <a12>0,0000000</a12> <p>7,0000000</p> </surface> <surface> <a0>1000,0000000</a0> <a1>0,0000000</a1> <a2>100,0000000</a2> <a11>0,1000000</a11> <a22>10,0000000</a22> <a12>0,1000000</a12> <p>5,0000000</p> </surface> </file> <file path="internalpressure.tar" type="tar"> <point> <x>2360,0000000</x> <y>0,0000000</y> </point> <point> <x>3532,0000000</x> <y>58,4000015</y> </point> <point> <x>4547,0000000</x> <y>103,8000031</y> </point> <point> <x>5764,0000000</x> <y>158,6999969</y> </point> <point> <x>6877,0000000</x> <y>209,0000000</y> </point> <point> <x>7900,0000000</x> <y>255,1999969</y> </point> <point> <x>8982,0000000</x> <y>304,0000000</y> </point> <point> <x>10074,0000000</x> <y>352,7999878</y> </point> <point> <x>11149,0000000</x> <y>400,8999939</y> </point> </file> <file path="externaldensity.tar" type="tar"> <point> <x>0,8943808</x> <y>0,0000000</y> </point> <point> <x>1,0004297</x> <y>1,0000000</y> </point> <point> <x>1,0124259</x> <y>1,1160001</y> </point> <point> <x>1,0233793</x> <y>1,2240000</y> </point> <point> <x>1,0292079</x> <y>1,2840000</y> </point> <point> <x>1,0409085</x> <y>1,4030000</y> </point> <point> <x>1,0498325</x> <y>1,4930000</y> </point> <point> <x>1,0583036</x> <y>1,5800000</y> </point> <point> <x>1,0686287</x> <y>1,6900001</y> </point> <point> <x>1,0780404</x> <y>1,7860010</y> </point> <point> <x>1,0865008</x> <y>1,8940001</y> </point> <point> <x>1,0918074</x> <y>1,9540000</y> </point> </file> <file path="externalcoriol.tar" type="tar"> <point> <x>0,0000000</x> <y>0,0000000</y> </point> <point> <x>1,0423599</x> <y>8,8731651</y> </point> </file> <file path="externalrotate.tar" type="tar"> <point> <x>0,2771824</x> <y>0,0000000</y> </point> <point> <x>51,5987129</x> <y>-0,8832195</y> </point> <point> <x>102,9263687</x> <y>-2,8315117</y> </point> <point> <x>161,3097382</x> <y>-4,0044746</y> </point> <point> <x>203,9690857</x> <y>-3,2529044</y> </point> <point> <x>250,3599396</x> <y>-4,8435221</y> </point> <point> <x>302,4907227</x> <y>-6,9018602</y> </point> <point> <x>351,8223267</x> <y>-5,4620886</y> </point> <point> <x>396,1837158</x> <y>-6,5484858</y> </point> </file> <file path="internalrgr.tar" type="tar"> <point> <x>1,0000000</x> <y>0,0000000</y> </point> <point> <x>1,1160051</x> <y>-7,7440825</y> </point> <point> <x>1,2240053</x> <y>-4,7421026</y> </point> <point> <x>1,2839999</x> <y>-1,4837382</y> </point> <point> <x>1,4029999</x> <y>0,6799557</y> </point> <point> <x>1,4930004</x> <y>3,0734160</y> </point> <point> <x>1,5800005</x> <y>4,8079190</y> </point> <point> <x>1,6899979</x> <y>6,9035168</y> </point> <point> <x>1,7860079</x> <y>7,7395725</y> </point> <point> <x>1,8939825</x> <y>9,9293804</y> </point> <point> <x>1,9540000</x> <y>8,4871855</y> </point> </file> <file path="internalCorKRoP.tar" type="tar"> <point> <x>0,0000000</x> <y>1,0000000</y> </point> <point> <x>1,0000000</x> <y>1,0000000</y> </point> </file> </report> |
Я получаю XML-строку от контроллера моего веб-API, который построен, как показано:
private string CreateXDoc(IEnumerable<PassedJSONConverted> passed)
{
XNamespace xmlns = "http://host.adp.com";
var doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
var jobListElement = new XElement(xmlns + "JobXML");
foreach (var objectItem in passed)
{
var loopElement = new XElement(xmlns + "JobsXML", new XElement(xmlns + "ID", objectItem.ID.ToString()), new XElement(xmlns + "Name", objectItem.Name), new XElement(xmlns + "Age", objectItem.Age.ToString()), new XElement(xmlns + "JobTitle", objectItem.JobTitle), new XElement(xmlns + "StartDate", objectItem.StartDate));
jobListElement.Add(loopElement);
}
doc.Add(jobListElement);
//Format without n's
return doc.ToString(SaveOptions.DisableFormatting);
}
Это хорошо, и XML установлен как показано:
- <JobXML xmlns="http://host.xxx.com">
- <JobsXML>
<ID>1</ID>
<Name>Dave</Name>
<Age>23</Age>
<JobTitle>Developer</JobTitle>
<StartDate>10/24/2013 6:40:28 AM</StartDate>
</JobsXML>
- <JobsXML>
<ID>2</ID>
<Name>John</Name>
<Age>44</Age>
<JobTitle>QA</JobTitle>
<StartDate>10/24/2013 6:40:28 AM</StartDate>
</JobsXML>
- <JobsXML>
<ID>3</ID>
<Name>Dave</Name>
<Age>23</Age>
<JobTitle>Senior Developer</JobTitle>
<StartDate>10/24/2013 6:40:28 AM</StartDate>
</JobsXML>
</JobXML>
Когда я возвращаю это как строку и пытаюсь выполнить ее синтаксический анализ на xDoc, как показано ниже:
private static string HandleResponse(HttpWebResponse httpResponse)
{
using (var responseReader = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8))
{
string responsePayload = responseReader.ReadToEnd();
var newxDoc = XDocument.Parse(responsePayload);
return responsePayload;
}
}
Строка ‘responsePayLoad’ во время выполнения устанавливается как показано:
"<JobXML xmlns="http://host.adp.com"><JobsXML><ID>1</ID><Name>Dave</Name><Age>23</Age><JobTitle>Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>2</ID><Name>John</Name><Age>44</Age><JobTitle>QA</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML><JobsXML><ID>3</ID><Name>Dave</Name><Age>23</Age><JobTitle>Senior Developer</JobTitle><StartDate>10/24/2013 6:45:22 AM</StartDate></JobsXML></JobXML>"
Это дает мне исключение в объекте ‘newxDoc’:
XmlException не обрабатывается. Данные на корневом уровне недействительны. Строка 1, позиция 1.
Может ли кто-нибудь сказать мне, где я ошибаюсь?
Наследование:
System.ApplicationException
Показать файл
Открыть проект
Открытые методы
Метод | Описание | |
---|---|---|
XmlFormatException ( string message ) : System |
Описание методов
XmlFormatException()
публичный метод
public XmlFormatException ( string message ) : System | ||
message | string | |
Результат | System |
Я обнаружил, что в моем коде существует "&"
, почему ошибка показывает
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(dsExport.Tables[0].Rows[i]["SubmissionData"].ToString());
«&» есть в представлении данных. Как удалить специальные символы, чтобы ошибка не отображалась снова?
Заранее спасибо
Поделиться
Источник
4 ответа
Microsoft DN
Поделиться
Try:
XmlDocument xmlDoc = new XmlDocument();
string str = dsExport.Tables[0].Rows[i]["SubmissionData"].ToString();
str = System.Web.HTTPUtility.HTMLDecode(str);
xmlDoc.LoadXml(str);
Pål Thingbø
Поделиться
& не является незаконным символом XML. Это не ваша проблема. Вам нужно зарегистрировать полученный XML-код, прежде чем вы спросите кого-нибудь о вашей проблеме. Вероятно, вам нужно
HTTPUtility.HTMLDecode(yourformdata)
Но я очень хорошо чувствую SQL-инъекцию.
Pål Thingbø
Поделиться
Извините, я слишком поздно отвечаю, но надеюсь, что это поможет некоторым другим парням. Эта проблема связана с кодировкой специальных символов в XML. Пожалуйста, найдите приведенную ниже ссылку, которая может вам помочь https://support.google.com/checkout/sell/answer/70649?hl=en
Благодаря,
Виджай Шерекар
Vijay
Поделиться
Ещё вопросы
- 0Mysql — выбрать случайные 4 данных из столбца, отличного от 2 различных столбцов
- 1Шаблон наблюдателя в Android
- 1различная точность числового текста в зависимости от числового значения
- 1Кнопка маршрутизации не работает в Angular 2
- 0jQuery Mobile: уберите метку с диапазона и сделайте слайдер шире
- 1Javascript document.cookie = «ключ = значение» добавляется вместо замены
- 1Добавить дочерний элемент в свойства класса в течение цикла
- 0PHP-код по умолчанию с ошибкой, когда это не должно быть
- 0Angularjs: элементы массива Sum для диаграмм
- 1Переименование файлов с косой чертой в имени файла (python)
- 0Какую версию Nsight можно использовать в CUDA5.5 в VisualStudio2010?
- 1Схема <[объект объекта]> уже существует с другим определением
- 1Как открыть конкретный экран после нажатия на уведомление?
- 0PHP exec () с URL?
- 1Как перенаправить поток Request.Content
- 1Удаление nltk стоп-слов из строк csv DataFrame
- 0c ++ вектор векторов размера следующего столбца
- 1HTTP-обработчик без ответа
- 0JQuery Datepicker: как отрицать это, используя мой CSS
- 0Chrome заблокирован localhost с ошибкой ваше соединение не является частным
- 0нажмите следующую страницу [Выбрать форму]
- 0Читать сырой сокет ip заголовок? C ++
- 1HTML 5 Геолокация не работает в Safari
- 0Как преобразовать результат хранимой процедуры MySQL в данные JSON в сценарии оболочки?
- 1Таймер JavaScript для использования несколько раз на странице
- 0JQuery Назначение разницы ширины для элементов <li>
- 0Карты Google — Использование Заменить
- 1Правильный способ передачи ошибок обратно в вызывающий код
- 1Как проверить все флажки в списке флажков при первой загрузке страницы?
- 1Изменить параметр URL
- 1Диапазоны подстрок (Java)
- 1KeyboardInterrupt несколько потоков одновременно
- 1Удаление смежных дубликатов в ArrayList [Java]
- 0INNER JOIN полезен здесь? [Дубликат]
- 1Как добавить различные editText в один TextView
- 1Как получить имя целевой функции из склеарна `Bunch`
- 1отображать необъектные значения во вложенных массивах в javascript
- 0почему это JQuery не добавляет правильные значения в моей БД
- 1Во время вызова OnActionExecuting for Web API — Как сопоставить контроллер / класс действия из строки маршрута для чтения атрибутов действия
- 1преобразовать данные массива из объекта / float в int для использования в методе
- 1Назначение «name» и «defaults» в config.Routes.MapHttpRoute
- 0Вставка CSS-идентификатора в jQuery
- 0Повторная вставка div в форму после удаления div из формы (диалоговое окно jQuery ui)
- 1Как получить секунды с эпохи без связи со временем устройства? [Дубликат]
- 1Как удалить все неиспользуемые переменные в WebStorm?
- 0Перезагрузка угловых / ионных повторов
- 0Оставил соединение, мне нужно объяснение о коде
- 0При использовании Angular с SignalR, как я могу уведомить контроллер, когда в объект вносится изменение?
- 0как проверить, существует ли имя пользователя в angularjs
Search code, repositories, users, issues, pull requests…
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
I have the following XML response I am trying to deserialize using XmlSerializer. When I remove the call to XML serializer I throw no errors. Every time I use XmlSerializer I get
an exception. What am I missing?
Exception is:
System.Xml.XmlException: Root element is missing.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlTextReader.Read()
at System.Xml.XmlReader.MoveToContent()
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderSubmitReportResponse.Read5_NeweggAPIResponse()
Xml Doc is:
<?xml version="1.0" encoding="utf-8"?>
<NeweggAPIResponse>
<IsSuccess>true</IsSuccess>
<OperationType>OrderListReportResponse</OperationType>
<SellerID>myID</SellerID>
<ResponseBody>
<ResponseList>
<ResponseInfo>
<RequestId>XXXXXXXX</RequestId>
<RequestType>ORDER_LIST_REPORT</RequestType>
<RequestDate>07/26/2012 09:27:06</RequestDate>
<RequestStatus>SUBMITTED</RequestStatus>
</ResponseInfo>
</ResponseList>
</ResponseBody>
</NeweggAPIResponse>
My call to XmlSerializer is:
XmlSerializer serializer = new XmlSerializer(typeof(SubmitReportResponse));
reportReq = serializer.Deserialize(respStream) as SubmitReportResponse;
SubmitReportResponse class is:
public enum RequestStatus
{
ALL,
SUBMITTED,
IN_PROGRESS,
FINISHED,
CANCELLED
}
/// <summary>
/// TODO: Update summary.
/// </summary>
[XmlRoot("NeweggAPIResponse")]
public class SubmitReportResponse
{
public string IsSuccess { get; set; }
public string OperationType { get; set; }
public string SellerID { get; set; }
public ReportResponseBody ResponseBody { get; set; }
public SubmitReportResponse()
{
ResponseBody = new ReportResponseBody();
}
}
public class ReportResponseBody
{
public string Memo { get; set; }
public ReportResponseList[] ResponseList { get; set; }
public ReportResponseBody()
{
ResponseList = new ReportResponseList[0];
}
}
public class ReportResponseList
{
public ResponseInfo[] ResponseInfo { get; set; }
public ReportResponseList()
{
ResponseInfo = new ResponseInfo[0];
}
}
public class ResponseInfo
{
public string RequestId { get; set; }
public string RequestType { get; set; }
public string RequestDate { get; set; }
public RequestStatus RequestStatus { get; set; }
public ResponseInfo()
{
RequestStatus = new RequestStatus();
}
}
EDIT:
Requesting Code:
HttpWebRequest request = WebRequest.Create(endpoint) as HttpWebRequest;
request.Proxy = null;
request.Method = "POST";
//Specify the xml/Json content types that are acceptable.
request.ContentType = "application/xml";
request.Accept = "application/xml";
//Attach authorization information
request.Headers.Add("Authorization", apikey);
request.Headers.Add("Secretkey", secretkey);
GetOrderListRequest requestObj = new GetOrderListRequest();
requestObj.OperationType = OperationType.OrderListReportRequest;
requestObj.RequestBody = new OrderListRequestBody();
requestObj.RequestBody.OrderReportCriteria = new OrderReportCriteria();
requestObj.RequestBody.OrderReportCriteria.Status = 3;
requestObj.RequestBody.OrderReportCriteria.KeywordsType = 0;
requestObj.RequestBody.OrderReportCriteria.OrderDateFrom = "2012-01-01";
requestObj.RequestBody.OrderReportCriteria.OrderDateTo = "2012-07-26";
requestObj.RequestBody.OrderReportCriteria.OrderDownloaded = "false";
string requestBody = SerializeToString(requestObj);
byte[] byteStr = Encoding.UTF8.GetBytes(requestBody);
request.ContentLength = byteStr.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(byteStr, 0, byteStr.Length);
}
//Parse the response
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
//Business error
if (response.StatusCode != HttpStatusCode.OK)
{
Console.WriteLine(string.Format("Error: response status code is{0}, at time:{1}", response.StatusCode, DateTime.Now.ToString()));
return;
}
else if (response.StatusCode == HttpStatusCode.OK)//Success
{
using (Stream respStream = response.GetResponseStream())
{
StreamReader readerOK = new StreamReader(respStream);
//Console.WriteLine(String.Format("Result:{0}", DateTime.Now.ToString()));
Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd()));
XmlSerializer serializer = new XmlSerializer(typeof(SubmitReportResponse));
reportReq = serializer.Deserialize(respStream) as SubmitReportResponse;
}
}
}
public string SerializeToObj(object obj)
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Encoding = new UTF8Encoding(false);
settings.Indent = true;
XmlSerializer xs = new XmlSerializer(obj.GetType());
MemoryStream ms = new MemoryStream();
// xs.Serialize(ms, obj,ns);
XmlWriter writer = XmlWriter.Create(ms, settings);
xs.Serialize(writer, obj, ns);
return Encoding.UTF8.GetString(ms.ToArray());
}
Resolution:
It seems that calling Console.WriteLine(String.Format("{0}", readerOK.ReadToEnd()));
causes the stream to be consumed and be unavailable for serialization. Removing this line allowed me to properly serialize the XML into my classes.