2012-08-23 100 views
0

當我嘗試發送超過100個審計條目時,收到「遠程服務器返回意外響應:(400)錯誤請求」。我使用Fiddler來幫助調試並確實將請求發送到服務器。客戶端和服務器都使用相同的接口。WCF:發送少量數據時發送錯誤請求(400)

[ServiceContract] 
public interface ISyncDataContract 
{ 
    #region Audit Log 

    /// <summary> 
    /// Creates a collection of new audit entries items in the database. 
    /// </summary> 
    /// <param name="items">The audit entry items to be created.</param> 
    /// <returns><c>True</c> if created successfully; otherwise, <c>false</c>.</returns> 
    [OperationContract] 
    [WebInvoke(UriTemplate = "AuditEntries", Method = "PUT")] 
    bool CreateAuditEntryItems(AuditEntryItemCollection items); 

    /// <summary> 
    /// Gets all the audit entry items available. 
    /// </summary> 
    /// <returns>An <see cref="AuditEntryItemCollection"/> object containing all the 
    /// available audit entry items.</returns> 
    [OperationContract] 
    [WebGet(UriTemplate = "AuditEntries")] 
    Message GetAuditEntryItems(); 

    #endregion 
} 

AuditEntryItem.cs

[DataContract] 
public class AuditEntryItem 
{ 
    #region Constructor/Deconstructor 

    /// <summary> 
    /// Initializes a new instance of the <see cref="AuditEntryItem"/> class. 
    /// </summary> 
    public AuditEntryItem() 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="AuditEntryItem"/> class. 
    /// </summary> 
    /// <param name="auditEntry">The audit entry.</param> 
    public AuditEntryItem(AuditEntry auditEntry) 
    { 
     if (auditEntry == null) 
     { 
      throw new ArgumentNullException("auditEntry"); 
     } 

     this.Audit_Type = auditEntry.Audit_type; 
     this.ComputerName = Environment.MachineName; 
     this.Message = auditEntry.Message; 
     this.Sequence_Number = auditEntry.Sequence_number; 
     this.Session_ID = auditEntry.Session_ID; 
     this.SyncDate = DateTime.Now; 
     this.Time_Stamp = auditEntry.Time_stamp; 
     this.User_ID = auditEntry.User_ID; 
    } 

    #endregion Constructor/Deconstructor 

    #region Properties 

    /// <summary> 
    /// Gets or sets the session ID. 
    /// </summary> 
    /// <value> 
    /// The session ID. 
    /// </value> 
    [DataMember] 
    [XmlElement(ElementName = @"Session_ID")] 
    public string Session_ID { get; set; } 

    /// <summary> 
    /// Gets or sets the user ID. 
    /// </summary> 
    /// <value> 
    /// The user ID. 
    /// </value> 
    [DataMember] 
    [XmlElement(ElementName = @"User_ID")] 
    public string User_ID { get; set; } 

    /// <summary> 
    /// Gets or sets the time stamp. 
    /// </summary> 
    /// <value> 
    /// The time stamp. 
    /// </value> 
    [DataMember] 
    [XmlElement(ElementName = @"Time_Stamp")] 
    public string Time_Stamp { get; set; } 

    /// <summary> 
    /// Gets or sets the sequence number. 
    /// </summary> 
    /// <value> 
    /// The sequence number. 
    /// </value> 
    [DataMember] 
    [XmlElement(ElementName = @"Sequence_number")] 
    public int Sequence_Number { get; set; } 

    /// <summary> 
    /// Gets or sets the message. 
    /// </summary> 
    /// <value> 
    /// The message. 
    /// </value> 
    [DataMember] 
    [XmlElement(ElementName = @"Message")] 
    public string Message { get; set; } 

    /// <summary> 
    /// Gets or sets the type of the audit. 
    /// </summary> 
    /// <value> 
    /// The type of the audit. 
    /// </value> 
    [DataMember] 
    [XmlElement(ElementName = @"Audit_type")] 
    public string Audit_Type { get; set; } 

    /// <summary> 
    /// Gets or sets the name of the computer. 
    /// </summary> 
    /// <value> 
    /// The name of the computer. 
    /// </value> 
    [DataMember] 
    [XmlElement(ElementName = @"ComputerName")] 
    public string ComputerName { get; set; } 

    /// <summary> 
    /// Gets or sets the sync date. 
    /// </summary> 
    /// <value> 
    /// The sync date. 
    /// </value> 
    [DataMember] 
    [XmlElement(ElementName = @"SyncDate")] 
    public DateTime? SyncDate { get; set; } 

    /// <summary> 
    /// Gets the time stamp value in a date time format. 
    /// </summary> 
    [XmlIgnore] 
    public DateTime DisplayTimeStamp 
    { 
     get { return this.TimeStampDateTime(); } 
    } 

    #endregion Properties 

    #region Overrides 

    public override bool Equals(object obj) 
    { 
     return obj is AuditEntryItem ? this.Equals((AuditEntryItem)obj) : false; 
    } 

    public bool Equals(AuditEntryItem other) 
    { 
     if (ReferenceEquals(this, other)) 
     { 
      return true; 
     } 

     return string.Equals(this.Audit_Type, other.Audit_Type) && 
       string.Equals(this.ComputerName, other.ComputerName) && 
       string.Equals(this.Message, other.Message) && 
       this.Sequence_Number == other.Sequence_Number && 
       string.Equals(this.Session_ID, other.Session_ID) && 
       this.SyncDate == other.SyncDate && 
       string.Equals(this.Time_Stamp, other.Time_Stamp) && 
       string.Equals(this.User_ID, other.User_ID); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      var result = (this.Audit_Type != null ? this.Audit_Type.GetHashCode() : 0); 
      result = (result * 397)^(this.ComputerName != null ? this.ComputerName.GetHashCode() : 0); 
      result = (result * 397)^(this.Message != null ? this.Message.GetHashCode() : 0); 
      result = (result * 397)^this.Sequence_Number.GetHashCode(); 

      result = (result * 397)^(this.Session_ID != null ? this.Session_ID.GetHashCode() : 0); 
      result = (result * 397)^(this.SyncDate != null ? this.SyncDate.GetHashCode() : 0); 
      result = (result * 397)^(this.Time_Stamp != null ? this.Time_Stamp.GetHashCode() : 0); 
      result = (result * 397)^(this.User_ID != null ? this.User_ID.GetHashCode() : 0); 
      return result; 
     } 
    } 

    #endregion Overrides 

    /// <summary> 
    /// Converts the Java time stamp value into a readable format. 
    /// </summary> 
    /// <returns>A readable date time format.</returns> 
    private DateTime TimeStampDateTime() 
    { 
     if (this.Time_Stamp.IsNullOrEmpty()) 
     { 
      return new DateTime(1970, 01, 01); 
     } 

     long value; 
     if (!long.TryParse(this.Time_Stamp, out value)) 
     { 
      return new DateTime(1970, 01, 01); 
     } 

     value = value/1000; 
     return new DateTime(1970, 01, 01).AddSeconds(value); 
    } 
} 

AuditEntryItemCollection.cs

[DataContract] 
[XmlRoot(ElementName = "AuditLog")] 
public class AuditEntryItemCollection 
{ 
    #region Declarations 

    #endregion Declarations 

    #region Constructor/Deconstructor 

    /// <summary> 
    /// Initializes a new instance of the <see cref="AuditEntryItemCollection"/> class. 
    /// </summary> 
    public AuditEntryItemCollection() 
    { 
     this.AuditEntryItems = new List<AuditEntryItem>(); 
    } 

    #endregion Constructor/Deconstructor 

    #region Properties 

    /// <summary> 
    /// Gets or sets the collection of <see cref="AuditEntryItem"/> 
    /// objects. 
    /// </summary> 
    /// <value> 
    /// The collection of <see cref="AuditEntryItem"/> objects. 
    /// </value> 
    [XmlElement(ElementName = @"AuditEntry")] 
    [DataMember] 
    public List<AuditEntryItem> AuditEntryItems { get; set; } 

    #endregion Properties 
} 

的App.config

<?xml version="1.0" encoding="utf-8" ?> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="restXmlBehavior"> 
     <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Xml" /> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
    </behavior> 
    <behavior name="rssAtomBehavior"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 

    <serviceBehaviors> 
    <behavior name="metadataBehavior" > 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<bindings> 
    <webHttpBinding> 
    <binding name="StreamedHttp" 
      maxReceivedMessageSize="2147483647" 
      transferMode="Streamed" > 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="6000000" /> 
    </binding> 
    </webHttpBinding> 
</bindings> 

UPDATE:

現在我得到的錯誤是「傳入消息(65536)的最大郵件大小已超出配額。爲了增加配額,在適當的綁定元素上使用MaxReceivedMessageSize屬性。「據我所知,我已經做了這個。是否有其他設置我需要設置?

+1

您有權訪問服務器嗎?檢查Windows事件查看器是否有錯誤。另請查看服務跟蹤查看器:http://msdn.microsoft.com/en-us/library/ms732023.aspx –

+0

嘗試對服務啓用跟蹤,以瞭解爲什麼會收到錯誤請求的確切原因。也請張貼你的原始請求看起來像從提琴手。 – Rajesh

回答

2

您可以確保httpRuntime是還配置了較大的請求:

(一個例子,從我用它來上傳文件:)服務抓起

<httpRuntime executionTimeout="3600" maxRequestLength="50000000" maxQueryStringLength="2097151" requestValidationMode="2.0" /> 

而且還可能看的結合(再次緩衝池大小,這些值都只是例子):

<binding name="WHB" maxReceivedMessageSize="50000000" maxBufferPoolSize="50000000" crossDomainScriptAccessEnabled="true"> 
      <readerQuotas maxArrayLength="50000000" maxStringContentLength="50000000" /> 
相關問題