2

これが私がやろうとしていることです(失敗しました、私は追加するかもしれません)そしてあなたが私に与えることができるどんな方向でもいただければ幸いです

HTML5サイトから、IIS7.5でホストされているクロスドメインWCFサービスにファイルをアップロードしたいと思います。

ファイルのアップロードに加えて、サーバーのアップロード機能に追加のパラメーターを送信する必要があります

これは可能ですか?

これが私のoperationContractの外観です:

[OperationContract]
[WebInvoke( Method = "POST",
UriTemplate = "/uploadmodeldata/?id={Id}&customerdatatype={customerdatatype}&data={data}")]
void UploadModelData(string Id, string customerdataType, byte[] data);

これが私のjqueryajaxリクエストです

function FileVisits() {

    var uid = checkCookie1();
    userid = uid.toString().replace(/"/g, '');
    var fileData = JSON.stringify({
   Id:userid ,customerdatatype:scanupload,
        data: $('#fileBinary').val()
    });
    alert(fileData);
        "use strict";
        var wcfServiceUrl = "http://xxxxx:1337/Service1.svc/XMLService/";
        $.ajax({
            cache: false,
            url: wcfServiceUrl + "uploadmodeldata/",               
            data: fileData,
            type: "POST",
            processData: false,
            contentType: "application/json",
            timeout: 10000,
            dataType: "json",
            headers:    {
                        'User-agent': 'Mozilla/5.0 (compatible) Greasemonkey',
                        'Accept': 'application/atom+xml,application/xml,text/xml',
                    },
            beforeSend: function (xhr) {
                $.mobile.showPageLoadingMsg();

                xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");


            },
            complete: function () {
                $.mobile.hidePageLoadingMsg();
            },

            success: function (data) {
                var result = data;


            },
            error: function (data) {
                alert("Error");
            }
        });

}

ファイルサイズが100kb未満の場合、このエラーが発生しました

方法は許可されていません

ただし、ファイルが100 kbより大きい場合、このエラーが発生しました

413エンティティを大規模にリクエスト

jqueryajaxからクロスドメインwcfにファイルをアップロードするにはどうすればよいですか。ありがとう

4

3 に答える 3

1

それは私に多くの作業を要しましたが、ここに私のコードがあります(誰かがそれを必要とする場合に備えて):

$("#UploadFileBtn").click(function () {     
    fileName = document.getElementById("filePicker").files[0].name;
    fileSize = document.getElementById("filePicker").files[0].size;
    fileType = document.getElementById("filePicker").files[0].type;     
    var file = document.getElementById("filePicker").files[0];
    if (file) {
    // create reader
    var reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function(e) {
        var content = e.target.result;
        content = content.substring(content.indexOf('64') + 3);
        bhUploadRequest = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" " +
                                             "xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" " + 
                                             "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
                                             "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
                             "<SOAP-ENV:Header>"+
                                "<m:FileName xmlns:m=\"http://tempuri.org/\">" + fileName + "</m:FileName>" +
                                "<m:Length xmlns:m=\"http://tempuri.org/\">" + fileSize + "</m:Length>" +
                             "</SOAP-ENV:Header>" +
                             "<SOAP-ENV:Body>" +
                                "<m:RemoteFileInfo xmlns:m=\"http://tempuri.org/\">" +
                                    "<m:FileByteStream>" + content + "</m:FileByteStream>" +
                                "</m:RemoteFileInfo>" +
                             "</SOAP-ENV:Body>" +
                         "</SOAP-ENV:Envelope>";

        $.ajax({
            type: "POST",
            async: true,
            url: wsFtransferUrl,
            data: bhUploadRequest,
            timeout: 10000,
            contentType: "text/xml",
            crossDomain: true,
            beforeSend: function (xhr) {
                xhr.setRequestHeader("SOAPAction", "http://tempuri.org/IFileTransferService/UploadFile");
                xhr.setRequestHeader("TICKET", Ticket);
            },              
            success: function (data) {
            alert('succes');
                $(data).find("UploadFileResponse").each(function () {
                    alert($(this).find("UploadFileResult").text());
                });
            },
            error: function (xhr, status, error) {
                alert('error:' + error);
            }
        });

    };
}
    return;

    });

これが私のWCF転送サービスです。

public void UploadFile(RemoteFileInfo request)
        {   
            string filePath = string.Empty;
            string guid = Guid.NewGuid().ToString();
            int chunkSize = 1024;
            byte[] buffer = new byte[chunkSize];
            long progress = 0;

            filePath = Path.Combine(uploadFolder, request.FileName);

            if (File.Exists(filePath))
                File.Delete(filePath);

            using (FileStream writeStream = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write))
            {
          do
                {
                    // read bytes from input stream
                    int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize);
                    if (bytesRead == 0)
                        break;
                    progress += bytesRead;                    
                    // write bytes to output stream
                    writeStream.Write(buffer, 0, bytesRead);
                }
                while (true);
            }
        }
于 2015-01-23T11:23:37.327 に答える
0

Method not allowed別のドメインのサービスを呼び出そうとしている原因が発生しています。これは同一生成元ポリシーに違反します。これはセキュリティ上の制限です。ほとんどの古いブラウザはそのような要求を拒否します。

javascriptでWebサービスの別のドメインにアクセスする場合は、クロスオリジンリソースシェアリングを設定する必要があります 。

クロスオリジンリソースシェアリング(CORS)は、Webページが別のドメインに対してXMLHttpRequestsを作成できるようにするメカニズムです。このような「クロスドメイン」リクエストは、同一生成元セキュリティポリシーに従って、Webブラウザによって禁止されます。CORSは、ブラウザとサーバーが相互作用して、クロスオリジンリクエストを許可するかどうかを決定する方法を定義します

Webサービスコードにアクセスできる場合は、サーバーでCORSリクエストを有効にできます。
corsを有効にすることは良いリソースです。ここにcorsに関するいくつかの説明があります

IIS 7では、web.configにいくつかのカスタムヘッダーを設定する必要があります。

<system.webserver>
 <httpprotocol>
  <customheaders>
   <add name="Access-Control-Allow-Origin" value="*" />
   <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customheaders>
 </httpprotocol>
</system.webserver>

IIS6の手順は次のとおりです

413エラーについては、バインディングで許可する最大ファイルサイズに関連しています

<bindings>
    <webHttpBinding>
      <binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" />
    </webHttpBinding>
</bindings>
于 2013-03-19T12:02:03.367 に答える
0

問題は「POST」にあります。問題を解決するには、次のようにします

Global.asaxを作成し、以下を追加してAjaxクロスドメインPOSTを有効にします。

 public void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST,OPTIONS");

            if ((HttpContext.Current.Request.HttpMethod == "OPTIONS"))
            {

                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }
    }
于 2016-06-24T19:25:12.273 に答える