0

I am getting "The remote server returned an unexpected response: (400) Bad Request" when I try to send more than 100 audit entries. I am using Fiddler to help debug and do see the request being sent to the server. The client and server both use the same interface.

[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:

The error I am now getting is "The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element." As far as I can tell, I have already done this. Is there some other setting I need to set?

4

1 回答 1

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" />
于 2012-08-28T13:46:14.300 回答