12

これは、この質問から派生したものです。「ルビコンを渡った」後、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 TaskSome 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());

...「ルート要素が見つかりません」というエラー メッセージを解決しました。したがって、私はマルシンの答えを正しいとマークしました。

4

4 に答える 4

17

グーグルでこのページを見つけたが、まだ困惑している方へ。埋められた MS Postのおかげで答えを見つけたと思います。

それは、以下を利用してストリームを最初にリセットすることにあります。

xmlStream.Seek(0, SeekOrigin.Begin);

読み取りの前にこれがないと、基本的にストリームの最後にロードを開始します。ストリームがないため、ルート要素はありません。

于 2015-10-26T15:46:42.243 に答える
2

それが実際に文字列化された XML である場合、XML 宣言は壊れています。バージョン番号を一重引用符または二重引用符で囲む必要があるため、代わり<?xml version=1.0?><?xml version="1.0"?>or <?xml version='1.0'?>. それはエラーIMOも説明します。

XML 宣言の構文: http://www.w3.org/TR/REC-xml/#NT-XMLDecl

于 2014-03-14T21:58:15.023 に答える
1

これは、以下のブログ投稿で説明されているように、カスタム パラメーター バインディングを設定することで簡単に実現できます。WebApiに生のxml投稿を使用しなければならなかったプロジェクトの1つで試しました

このブログエントリを確認してください

于 2018-03-09T17:29:06.500 に答える