1

WCF REST サービスの作成中に、json でデータを受信し、データベースに保存できます。今、同じサービスでファイル(オプション、画像またはビデオ)をアップロードするオプションを提供する必要があります。バイト配列を送信しようとしましたが、おそらくそのような長い配列のシリアル化が原因で、不正な要求エラーが発生しています。大きなファイルをアップロードするには、ストリームを使用する必要があることを読みました。他のパラメータを送信しながらどうすればいいですか? モバイルデバイスからデータを受信するためにこのサービスを作成しています。ここに私のサービスインターフェースがあります

[WebInvoke(UriTemplate = "SaveFBPost", 
    Method = "POST", 
    BodyStyle = WebMessageBodyStyle.Wrapped,
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
void SaveFacebookPost(FBPostData fbPostData);

パブリック クラス FBPostData:

[DataMember]
public string scheduleDate { get; set; }

[DataMember]
public string userId { get; set; }

[DataMember]
public string groupId { get; set; } 

[DataMember]
public string postText { get; set; }

[DataMember]
public byte[] file { get; set; }

[DataMember]
public string fileType { get; set; }

[DataMember]
public string accessToken { get; set; }
4

2 に答える 2

1

まず、web.config 内の特定のバインディングの maxBufferSize と maxArrayLength を増やして、問題が解決するかどうかを確認します。

エラーに関する詳細情報も取得できるはずなので、400 エラーが発生した理由を正確に確認できます。

このブログ記事は、過去に私にとっても役に立ちました - 下部にもいくつかの良いリンクがあります.

Streamクラスも見てください。「他のパラメーターを送信する」とはどういう意味かわかりません - これを明確にしていただければ、それについてさらに指示を与えることができます。

于 2013-05-09T20:35:59.697 に答える
1

この問題を解決するには、Android からのマルチパート アップロードとマルチパート パーサーを使用してストリームを使用する必要がありました。私は Apache mime ライブラリを使用してファイルをアップロードし、次のようなパラメーターを送信しました。

HttpPost postRequest = new HttpPost(
                context.getString(R.string.url_service_fbpost));
        MultipartEntity reqEntity = new MultipartEntity(
                HttpMultipartMode.BROWSER_COMPATIBLE);
        if(postData.data != null && !"".equals(postData.fileName)){
            ByteArrayBody bab = new ByteArrayBody(postData.data, postData.fileName);
            reqEntity.addPart("uploaded", bab);
        }
        reqEntity.addPart("scheduleDate", new StringBody(postData.scheduleDate));
        reqEntity.addPart("userId", new StringBody(postData.userId));
        reqEntity.addPart("groupIds",
                new StringBody(postData.groupIds.toString()));
        reqEntity.addPart("postText", new StringBody(postData.postText));
        reqEntity.addPart("postType", new StringBody(postData.postType));
        reqEntity.addPart("accessToken", new StringBody(postData.accessToken));
        if(postData.postId != null && postData.postId.length() > 0) {
            reqEntity.addPart("postId", new StringBody(postData.postId));
        }
        postRequest.setEntity(reqEntity);

その後、C# マルチパート パーサーを使用してファイルとパラメーターを取得しました。サービスのコードは次のとおりです。

[OperationContract]
[WebInvoke(Method = "POST",
        UriTemplate = "UploadFBPost",
        BodyStyle = WebMessageBodyStyle.WrappedRequest)]
void UploadFBPost(Stream stream);

 public void UploadFBPost(Stream stream)
{
    MultipartParser parser = new MultipartParser(stream);

    // Saves post data in database
    if (parser.Success)
    {
        string fileName = null, userId = null, postText = null, postType = null, accessToken = null;
        DateTime scheduleDate = DateTime.Now;
        string[] groupIds = null;
        int postId = 0;

        // Other contents
        foreach (MyContent content in parser.MyContents)
        {
            switch (content.PropertyName)
            {
                case "scheduleDate":
                    if (string.IsNullOrEmpty(content.StringData.Trim()))
                        scheduleDate = DateTime.Now;
                    else
                        scheduleDate = DateTime.ParseExact(content.StringData.Trim(), "M-d-yyyy H:m:s", CultureInfo.InvariantCulture);
                    break;

                case "fileName":
                    fileName = content.StringData.Trim();
                    break;

                case "userId":
                    userId = content.StringData.Trim();
                    break;

                case "postText":
                    postText = content.StringData.Trim();
                    break;

                case "accessToken":
                    accessToken = content.StringData.Trim();
                    break;

                case "groupIds":
                    groupIds = content.StringData.Trim().Split(new char[] { ',' });
                    break;

                case "postType":
                    postType = content.StringData.Trim();
                    break;

                case "postId":
                    postId = Convert.ToInt32(content.StringData.Trim());
                    break;
            }
        }

        string videoFile = null, imageFile = null;
        if (parser.FileContents != null)
        {
            string filePath = GetUniqueUploadFileName(parser.Filename);
            File.WriteAllBytes(filePath, parser.FileContents);
            if (postType == "photo")
                imageFile = Path.GetFileName(filePath); 
            else 
                videoFile = Path.GetFileName(filePath); 
        }
    }
}

送信するデータに応じてマルチパート パーサーを変更する必要があります。これが少数の時間を節約することを願っています。

助けてくれてありがとうレイ。

もう一つ。これらの行を Web 構成に追加する必要がありました。

<httpRuntime maxRequestLength="2000000"/>

<bindings>
  <webHttpBinding>
    <binding maxBufferSize="65536"
             maxReceivedMessageSize="2000000000"
             transferMode="Streamed">
    </binding>
  </webHttpBinding>
</bindings>
于 2013-05-20T09:58:17.113 に答える