これは、この質問から派生したものです。「ルビコンを渡った」後、HttpWebRequest 本体の値が null になるのはなぜですか? これは答えられました (1 つのハードルが飛び越えました) が、次のハードルが私をつまずかせます。
このコードで:
public async void PostArgsAndXMLFileAsStr([FromBody] string stringifiedXML, string serialNum, string siteNum)
{
XDocument doc = XDocument.Parse(await Request.Content.ReadAsStringAsync());
...またはこれ:
XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
...そして、これは着信 stringifiedXML として:
<?xml version=1.0?>
<LocateAndLaunch>
<Tasks>Some Task</Tasks>
<Locations>Some Location</Locations>
</LocateAndLaunch>
...例外が発生します:「System.Xml.XmlException was unhandled by user code HResult=-2146232000 Message=Root element is missing.」
このコード (同じ stringifiedXML) を使用すると、次のようになります。
XDocument doc = XDocument.Parse(stringifiedXML);
... 私は得る
System.InvalidOperationException はユーザー コードによって処理されませんでした。HResult=-2146233079 メッセージ = シーケンスには要素が含まれていません ソース = System.Core .MoveNext() in c:\HandheldServer\HandheldServer \Controllers\DeliveryItemsController.cs:109 行目 InnerException:
IOW、着信文字列の解析方法に応じて、「ルート要素が見つかりません」または「シーケンスに要素が含まれていません」のいずれかが表示されます
デュース・マカリスター・マクリーン・ヴァージニア・ウィーパーとは?!? <LocateAndLaunch>
ルート要素ではありませんか?Some Task
とSome Location
要素ではありませんか?
使用できないなどの理由で XML を手動で分解する必要がありますXDocument
か?
注: Fiddler から、本文データ (XML テキスト) を送信すると機能します (送信したものが期待どおりに届きます)。それでも、サーバー上の XML 解析コードは失敗します。
ただし、ハンドヘルド/Compact Framework クライアント コードから同じデータを送信しようとすると、「=」を介してデータだけが送信されます (<xml version="
サーバーに渡されるようなものです。クライアントでは、「この操作を実行できません」と表示されます)。リクエストが送信された後」
アップデート
したがって、Marcinの答えに基づいて、XDocument.Parse()に固執すれば大丈夫だと思われ、TToniの答えに基づいて、data/xml自体が悪い可能性があります。ファイルの内容は次のとおりです。
<?xml version="1.0"?>
<LocateAndLaunch>
<Tasks>
</Tasks>
<Locations>
</Locations>
</LocateAndLaunch>
したがって、バージョン番号の周りに引用符があります-しかし、これらを何とかエスケープする必要がありますか-これがデータが切り捨てられている理由です-最初の引用符(「1.0」の前)を見ると、それが文字列の終了であると考えられるためです。 ?
更新 2
Marcin、受信した「xml」データ (文字列) は、XDocument コードに到達する前に切り捨てられます。
[Route("api/DeliveryItems/PostArgsAndXMLFileAsStr")]
public async void PostArgsAndXMLFileAsStr([FromBody] string stringifiedXML, string serialNum, string siteNum)
{
string beginningInvoiceNum = string.Empty;
string endingInvoiceNum = string.Empty;
//XDocument doc = XDocument.Parse(stringifiedXML);
//XDocument doc = XDocument.Parse(await Request.Content.ReadAsStringAsync());
XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
更新 3
TToni の提案を使用し、二重引用符を一重引用符に置き換えると、次のようになります。
...私は今、サーバーメソッドに文字列全体を取得しています:
...しかし、まだ「ルート要素がありません」というメッセージが表示されます:
System.Xml.XmlException はユーザー コードによって処理されませんでした。HResult=-2146232000 Message=Root 要素がありません。Source=System.Xml LineNumber=0 LinePosition=0 SourceUri="" StackTrace: System.Xml.XmlTextReaderImpl.Throw(Exception e) で System.Xml.XmlTextReaderImpl.ParseDocumentContent() で System.Xml.XmlTextReaderImpl.Read() でSystem.Xml.Linq.XDocument.Load(XmlReader リーダー、LoadOptions オプション)、System.Xml.Linq.XDocument.Load(ストリーム ストリーム、LoadOptions オプション)、HandheldServer の System.Xml.Linq.XDocument.Load(ストリーム ストリーム)。 Controllers.DeliveryItemsController.d__2.MoveNext() c:\HandheldServer\HandheldServer\Controllers\DeliveryItemsController.cs: 66 行目 InnerException:
私がまだ狂っていなかったら、これは私を狂わせるでしょう。そのままでは、どこに追いやられているのかよくわかりません。多くの雇用主は意欲のある人を探しています。たぶんこれが彼らの意味ですか?
更新 4
これを使用して:
XDocument doc = XDocument.Parse(stringifiedXML);
...これの代わりに:
XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
...「ルート要素が見つかりません」というエラー メッセージを解決しました。したがって、私はマルシンの答えを正しいとマークしました。