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屬性。「據我所知,我已經做了這個。是否有其他設置我需要設置?
您有權訪問服務器嗎?檢查Windows事件查看器是否有錯誤。另請查看服務跟蹤查看器:http://msdn.microsoft.com/en-us/library/ms732023.aspx –
嘗試對服務啓用跟蹤,以瞭解爲什麼會收到錯誤請求的確切原因。也請張貼你的原始請求看起來像從提琴手。 – Rajesh