将文件发送到WCF时出错:请求失败,HTTP状态为400:错误请求

时间:2015-05-15 05:22:35

标签: c# asp.net .net wcf

我正在尝试使用wcf服务上传文件。我得到了The request failed with HTTP status 400: Bad Request

ds = WcfSpend.RegisterSupplier("blah", new SpendWcfRef.FileData 
{ 
    FileName = myFile.FileName.ToString(), 
    BufferData = file, 
    FilePosition = 1
});

WCF:

public DataSet RegisterSupplier(string SupplierId, FileData file)
{
    DataSet ds = new DataSet();
    return ds;
}

[ServiceContract]
public interface ISPEND
{

    [OperationContract]
    DataSet executeProcedure(string procedurename, string[] paramsName, string[] paramsValue, int num);

    [OperationContract]
    DataSet RegisterSupplier(string SupplierId, FileData file);

    //[OperationContract]
    //bool UploadFileData(FileData fileData);
}

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

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

    [DataMember]
    public int FilePosition { get; set; }
}

应用程序:

ds = WcfSpend.RegisterSupplier("blah", new SpendWcfRef.FileData
{ 
    FileName = myFile.FileName.ToString(), 
    BufferData = file, FilePosition = 1
});

Apllication配置文件:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_ISPEND" 
                closeTimeout="00:01:00"     
                openTimeout="00:01:00" 
                receiveTimeout="00:10:00" 
                sendTimeout="00:01:00" 
                allowCookies="false" 
                bypassProxyOnLocal="false"
                hostNameComparisonMode="StrongWildcard"
                maxBufferSize="2147483647" 
                maxBufferPoolSize="2147483647" 
                maxReceivedMessageSize="2147483647" 
                messageEncoding="Text" 
                textEncoding="utf-8" 
                transferMode="Buffered" 
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="2147483647"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"
                    maxBytesPerRead="2147483647" 
                    maxNameTableCharCount="2147483647" />
                <security mode="None">
                    <transport clientCredentialType="None" 
                        proxyCredentialType="None" 
                        realm="" />
                    <message clientCredentialType="UserName" 
                        algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client/>
</system.serviceModel>

WCF WEB CONFIG:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="myBindingForBigArrays"
                openTimeout="00:10:00" 
                closeTimeout="00:10:00" 
                receiveTimeout="00:10:00" 
                sendTimeout="00:10:00" 
                maxReceivedMessageSize="2147483647"
                maxBufferPoolSize="2147483647" 
                maxBufferSize="2147483647">
                <readerQuotas maxDepth="64"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"
                    maxBytesPerRead="4096"
                    maxNameTableCharCount="16384"/>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel> 

1 个答案:

答案 0 :(得分:0)

可能会有一些因素导致您看到的错误。我建议的第一件事是将您创建的绑定配置分配给明确定义的端点。像这样:

RANK

以上是服务的配置。确保使用命名空间完全限定合同名称,并且服务名称必须与.svc文件的标记中的名称相同。

你会为客户做类似的事情,除了它是<!-- This goes in the <system.serviceModel> section --> <services> <service name="MyService"> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="myBindingForBigArrays" contract="<namespace>.ISpend" /> </service> </services> 标签,而不是<client>

如果未指定要在端点中使用的绑定配置,则WCF将使用所选绑定类型的默认(较低)值。另一种方法是通过省略<service>属性,使绑定配置成为这种绑定的默认配置。

如果这不能解决问题,您还可以尝试调整namemaxRequestLength元素的<httpRuntime>值。 <system.web><system.web>的孩子:

<configuration>