WCF在尝试上传时返回400错误请求

问题描述:

我一直在这里已经有一段时间了,并且非常感谢第二方意见。似乎无法弄清楚为什么我得到一个400坏请求。WCF在尝试上传时返回400错误请求

WCF Web配置

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="FileTransferServicesBinding" 
     transferMode="Streamed" messageEncoding="Mtom" 
     sendTimeout="01:05:00" receiveTimeout="00:10:00" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
maxNameTableCharCount="2147483647" /> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="FileTransferServiceBehavior"> 

    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="FileTransferServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service name="PP.Live.WCFService.MobileClient"> 
    <endpoint name="MobileClientEndpoint" binding="basicHttpBinding" bindingConfiguration="FileTransferServicesBinding" contract="PP.Live.WCFService.LiveService"/> 
    </service> 
</services> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 

然后是服务合同:

[ServiceContract] 
public interface LiveService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST")] 
    UploadMedia UploadFile(System.IO.Stream fileData); 


} 

[DataContract] 
public class UploadMedia 
{ 
    [DataMember] 
    public UploadStatus Status { get; set; } 

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

public enum UploadStatus 
{ 
    Success, 
    Error 
} 

而SVC:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class MobileClient : LiveService 
{ 

    public UploadMedia UploadFile(System.IO.Stream fileData) 
    { 
     Trace.WriteLine("Uploading File"); 
     UploadMedia uploadMedia = new UploadMedia(); 
     try 
     { 
      //byte[] imageBytes = StreamHelper.ReadToEnd(fileData); 
      var memoryStream = new MemoryStream(); 
      fileData.CopyTo(memoryStream); 
      byte[] imageBytes = memoryStream.ToArray(); 

      memoryStream.Close(); 
      memoryStream.Dispose(); 

      string token = StoreFile(imageBytes); 

      fileData.Close(); 
      fileData.Dispose(); 

      if (!string.IsNullOrWhiteSpace(token)) 
      { 
       uploadMedia.Message = token; 
       uploadMedia.Status = UploadStatus.Success; 
      } 
      else 
      { 
       uploadMedia.Message = "No Token"; 
       uploadMedia.Status = UploadStatus.Error; 
      } 
     } 
     catch (Exception ex) 
     { 
      uploadMedia.Message = ex.Message + ex.StackTrace; 
      uploadMedia.Status = UploadStatus.Error; 

     } 

     return uploadMedia; 
    } 

谢谢你这么多的期待在这为了我。

+0

请发布您正确的'web.config'。您发布的内容不完整。例如,你有一个开放的'system.serviceModel'标签,但不能关闭。 – 2012-03-23 01:03:13

+0

你的客户端的.config文件是什么样的? – Tung 2012-03-23 04:16:19

在basicHTTPBinding中更改消息的大小,这可能是因为文件大小大于WCF可以处理的大小。

参阅以下链接 -

http://forums.asp.net/t/1299246.aspx/1

尝试启用您的服务Tracing明白为什么你得到一个400错误请求。

为了访问你的服务,你需要让你的的WebHttpBinding的结合,其中如在你的配置使用的是basicHttpBinding的

还要确保你已经使用了KnowType属性为您服务,以确定一个RESTful方式您的UploadMedia和UploadStatus对象进行反序列化。