7

私はWCF初心者です。ファイルをアップロードするための単純な WCF サービスとクライアントを作成しました。しかし、約 100KB 以上をアップロードすると、400 個の不正な要求が発生しました。インターネットで検索したところ、max* Length または max* *size の変更に関する解決策が見つかりました。しかし、私はまだ苦労しています。

そこで、専門家に問題の解決方法をお聞きしたいと思います。

サービスコードはこちら

[ServiceContract]
public interface IService1
{

    [OperationContract]
    void SaveFile(UploadFile uploadFile);
}


[DataContract]
public class UploadFile
{
    [DataMember]
    public string FileName { get; set; }

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


public class Service1 : IService1
{

    public void SaveFile(UploadFile uploadFile)
    {
        string str = uploadFile.FileName;
        byte[] data = uploadFile.File;
    }
}

サービス構成はこちら。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="64000000"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <webHttpBinding>
        <binding maxBufferSize="64000000" maxReceivedMessageSize="64000000" maxBufferPoolSize="64000000">
          <readerQuotas maxDepth="64000000" maxStringContentLength="64000000" maxArrayLength="64000000" maxBytesPerRead="64000000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>

 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

クライアントコードはこちら。

private void button1_Click(object sender, RoutedEventArgs e)
{
    FileInfo info = new FileInfo(@"C:\Users\shingotada\Desktop\4.png");

    byte[] buf = new byte[32768];
    Stream stream = info.OpenRead();
    byte[] result;

    using (MemoryStream ms = new MemoryStream())
    {
        while (true)
        {
            int read = stream.Read(buf, 0, buf.Length);
            if (read > 0)
            {
                ms.Write(buf, 0, read);
            }
            else
            {
                break;
            }
        }
        result = ms.ToArray();
    }

        UploadFile file = new UploadFile();
        file.File = result;
        file.FileName = "test";

        ServiceReference2.Service1Client proxy2 = new ServiceReference2.Service1Client();
        proxy2.SaveFile(file);  //400 bad request
}

クライアント構成はこちら。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="64000000"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:53635/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference2.IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

ありがとう。

4

1 に答える 1

9

あなたは解決策に非常に近いですが、バインディングを混ぜています。サービスはbasicHttpBindingを使用していますが、webHttpBindingにサイズ制限を設定しています。

したがって、サービスのweb.configで、webHttpBindingをbasicHttpBindingに置き換えます。これは、次のように機能します。

  <basicHttpBinding>
    <binding maxBufferSize="64000000" maxReceivedMessageSize="64000000" maxBufferPoolSize="64000000">
      <readerQuotas maxDepth="64000000" maxStringContentLength="64000000" maxArrayLength="64000000" maxBytesPerRead="64000000" />
      <security mode="None"/>
    </binding>
  </basicHttpBinding>
于 2012-04-18T17:43:56.227 に答える