6

FormData オブジェクトを使用してファイルを要求に追加するときに、XMLHttpRequest オブジェクトに独自の境界を設定する方法を見つけようとしています。これに関する複数の投稿を見たことがありますが、誰もが「境界を設定しないでください。自動的に生成されます」と言います。これは私が望むものではありません。この種の応答が得られないように、必要なことを説明させてください。

2 つの画像といくつかの json データを含む multipart/form-data リクエストを送信する Web サービス エンドポイントがあります。WCF にはマルチパート リクエストを解析する方法がないため、オープン ソース コードを使用して独自のパーサーを作成しました。それが機能する方法は、リクエストの各セクションを分離するために使用される境界を定義し、そこからすべてがうまく機能することです。そのため、解析クラスが入力ストリームで何かを見つけられるようにするには、境界をサーバー コードが期待するものに正確に設定できる必要があります。

私は Fiddler を使用してこれを実行したことがあり、同僚は私のメソッドを呼び出すビルド中のアプリでこれを実行できるため、これを実行できることはわかっていますが、Postman という Chrome ブラウザー アプリを使用して動作させようとしています。 FormData オブジェクトを使用してマルチパート リクエストを送信します。リクエストが通常次のような独自の境界を生成するという事実以外は機能しています。

----WebKitFormBoundaryQUWQnB6c7TzNzdcz

最後に追加された文字列はランダムに生成されるため、同じになることはありません。サーバーはどの境界を探すべきかを知る方法がないため、このツールを使用してエンドポイントをテストすることはできません。

境界を含む Content-Type ヘッダーを設定しようとしましたが、要求にヘッダーが追加されていることが要求に示されていますが、本文はまだランダムな境界を使用しています。

問題は、FormData オブジェクトや XMLHttpRequest オブジェクトに、生成されているランダムな境界の代わりに自分の境界を使用するように指示するにはどうすればよいかということです。

これがやりたいことが珍しいことだとは想像できません。つまり、これまでの multipart/form-data を使用するサービスを呼び出すすべての経験から、API で境界を設定するものを教えてくれましたが、誰も「ただドンドン」とは言いませんでした。設定しないと、生成されたランダムなジャンクを使用します...」

また、ビジュアルとして、ヘッダーに表示されているのは次のとおりです。

Request Headers
POST /DHICachet.svc/json/DepositCheck HTTP/1.1
Host: dhiibews.securexfr.com
Connection: keep-alive
Content-Length: 514696
Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Content-Type: multipart/form-data; boundary=myboundary
Cache-Control: no-cache
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: ASP.NET_SessionId=zdepe2nhkz0vbhxiulzc2qq1

Request Payload
------WebKitFormBoundaryQUWQnB6c7TzNzdcz
Content-Disposition: form-data; name="item"; filename="Screen shot 2012-09-03 at 4.00.10 AM.png"
Content-Type: image/png


------WebKitFormBoundaryQUWQnB6c7TzNzdcz--

私の境界がmyboundaryリクエストヘッダーに設定されていても、本文は舞台裏で生成された境界をそのまま配置することに注意してください。

4

3 に答える 3

1

これは私の質問に実際には答えませんが、回避策を見つけました。content-type ヘッダーで文字列計算を行うことで、実際に境界を検出できることに気づきました。コードに次を追加しました。

string contenttype = _ctx.IncomingRequest.Headers["Content-Type"].ToString();
string boundary = contenttype.Substring(contenttype.IndexOf('=') + 1);

これにより、デバッグのために任意の境界を受け入れることができます。ただし、本番環境には特定の境界が必要です。

于 2013-02-07T17:44:50.037 に答える
0

同様の問題があり、投稿を行うときにコンテンツタイプヘッダーをに設定するとundefined、問題が修正されました...'Content-Type': undefined

ブラウザは自動的に FormData の POST を正しく処理し、設定Content-typeされていない場合は境界を含め、期待どおりのヘッダーを設定すると思います。したがって、これは、サーバー上でリクエスト ヘッダーの特別な解析ロジックが必要ないことを意味します。

于 2016-09-30T14:52:03.920 に答える