我可以在WCF中使用datacontracts进行流式传输而不是消息合同.
如果是,它会提供任何性能改进吗?
谢谢
我想为数据契约序列化类创建/推断模式.
当我使用[DataContract(IsReference = true)]属性时,序列化程序会注入属性z:Id="i2"并z:Ref="i2"引用相同的对象实例.
两个属性都来自http://schemas.microsoft.com/2003/10/Serialization/命名空间.
问题:
xs:ID/ xs:IDREFpair.那是对的吗?提前致谢.
c# xsd xml-serialization datacontract datacontractserializer
到现在为止,在使用WCF时,我一直将整个EF生成的实体或POCO(通过修改T4模板以包含POCO和属性上的DataContract和DataMember)公开为DataContract。
现在,我遇到了一种情况,我无法公开全部内容,需要显式指定DataContract作为实体的子集。
值得一提的是,我的实体之一如下所示:

我只想公开ID,名称,CategoryId,价格。
字段的其余部分的插入/更新(ActiveFrom,InactiveDate,Supported)的东西,将根据BR来决定,而客户不知道,也不应该确实知道,他们什么。
我尝试了以下方法,但是每种方法似乎都存在问题/不起作用:
使用AutoMapper:我需要将源对象映射到目标对象,这是一种单向映射,因此出于演示目的,我可以映射Product到ProductContract。但是对于添加/更新产品,它无法工作,因为它无法进行双向映射。
使用反射并为实体创建一个元数据类,然后将该[DataMember]属性添加到Metadata类的属性中,如下所示(请注意,我没有包括不需要的字段):
public class ProductMD : AssociatedMetadataTypeTypeDescriptionProvider
{
public ProductMD() :
base(typeof(Product))
{
}
[DataMember]
public int Id{ get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public int? CategoryID { get; set; }
[DataMember]
public decimal? Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后将ProductMD用作Product
部分类的属性,而无需触碰自动生成的实体(仅供参考:我已将POCO T4模板生成器更改为[DataContract]在每个实体上都包含
):
[MetadataType(typeof(ProductMD))] …Run Code Online (Sandbox Code Playgroud)我DataGrid在 WPF 应用程序中有ItemsSource一个我编写的自定义集合。该集合强制其所有项目满足某个要求(即它们必须介于某个最小值和最大值之间)。
集合的类签名是:
public class CheckedObservableCollection<T> : IList<T>, ICollection<T>, IList, ICollection,
INotifyCollectionChanged
where T : IComparable<T>, IEditableObject, ICloneable, INotifyPropertyChanged
Run Code Online (Sandbox Code Playgroud)
我希望能够使用这样的DataGrid功能,即在DataGrid结果的最后一行提交编辑,将新项目添加到ItemsSource.
Unfortunately the DataGrid simply adds a new item created using the default constructor. So, when adding a new item, DataGrid indirectly (through its ItemCollection which is a sealed class) declares:
ItemsSource.Add(new T())
Run Code Online (Sandbox Code Playgroud)
where T is the type of elements in the CheckedObservableCollection. I would like for the grid to …
我正在看微软的如何:为类或结构创建基本数据合同,但它给我留下了很多问题.
他们提供了这个非常简单的例子:
using System;
using System.Runtime.Serialization;
[DataContract]
public class Person
{
// This member is serialized.
[DataMember]
internal string FullName;
// This is serialized even though it is private.
[DataMember]
private int Age;
// This is not serialized because the DataMemberAttribute
// has not been applied.
private string MailingAddress;
// This is not serialized, but the property is.
private string telephoneNumberValue;
[DataMember]
public string TelephoneNumber
{
get { return telephoneNumberValue; }
set { telephoneNumberValue = value; }
} …Run Code Online (Sandbox Code Playgroud) 下面用som模拟代码来说明我的例子.问题是lambda表达式.如果我在代码示例中保留它,当我尝试调用服务时它将不会序列化.但是,如果我.ToList()在lambda之后键入它应该序列化.
这是为什么?我不明白为什么下面的代码不起作用...有人关心开导我吗?:)
var list = new EntityPerson
{
Names = modelPerson.Names.Select(
n => new EntityName
{
Text = n.Text
})
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Silverlight 4,.NET 4.0.
我有一个在共享库中定义的对象(在我的Silverlight项目和托管WCF服务的Web项目之间共享)
该对象是一个树结构,其中包含其子项列表,以及对其父项和根的引用.
即.
class TreeNode
{
public List<TreeNode> Children {get; set;}
public TreeNode Root { get; set; }
public TreeNode Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是当Silverlight尝试获取此对象并将其发送到服务器时,我得到一个关于循环引用的例外.经过一些研究,我发现我必须将属性IsReference启用为true,如下所示:
[DataContract(IsReference = true)]
class TreeNode
{
public List<TreeNode> Children {get; set;}
public TreeNode Root { get; set; }
public TreeNode Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是当我这样做时,我的WCF服务不再起作用,因为它无法为此加载所需的程序集:
"无法加载文件或程序集'System.Runtime.Serialization,Version = 2.0.5.0"
这是因为包含TreeNode类的项目是针对Silverlight运行时而不是.NET运行时构建的,并且使用System.Runtime.Serialization v2.0.5.0,而Web项目和WCF服务使用v4.0.30319.
所以,我的问题是:有没有一种方法可以让这个对象序列化,同时保留引用而不会将整个对象结构移动到针对标准.NET 4.0运行时构建的不同项目?
此外,值得注意的是我尝试使用条件编译,例如:
#if SILVERLIGHT
[DataContract(IsReference = true)]
#endif
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为需要知道它的WCF服务必须保留引用...
非常感谢任何帮助.
尝试传递包含接口和接口/类列表的基本类型的"复杂"类类型.
我猜这个有问题的成员是:
public List<IMyInterface> IntrfList
Run Code Online (Sandbox Code Playgroud)
运行时错误:
接收到http:/localhost/xxxxxx/xxxxxService.svc的HTTP响应时发生错误.这可能是由于服务端点绑定不使用HTTP协议.这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭).请参阅服务器日志以获取更多详
MS服务跟踪查看器(SvcTraceViewer)中的描述性错误:
类型'myType'无法序列化.请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员.如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记.有关其他受支持的类型,请参阅Microsoft .NET Framework文档.
我按照解释的建议做了但没有帮助.
"共享"类:
[System.Runtime.Serialization.DataContract]
public class ServerState
{
private Queue<IJob> _mWaitingQueue;
public Queue<IJob> mWaitingQueue
{
get
{
lock (_LockObjWaiting)
{
return _mWaitingQueue;
}
}
private set
{
_mWaitingQueue = value;
}
}
private object _LockObjWaiting = new object();
private List<IJob> _mInPrograssList = new List<IJob>();
[DataMember]
public List<IJob> mInPrograssList
{
get
{
return _mInPrograssList;
}
private set
{
_mInPrograssList = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
IJob是一个界面.IJob的结构是这样的:
IJob (Interface)
- JobBase (Abstract class) …Run Code Online (Sandbox Code Playgroud) 如何获取Web服务方法来访问URI和复杂POST数据中的参数?
我有一个Web服务方法,在URI中有一些参数:
"/api/{something}/{id}"
Run Code Online (Sandbox Code Playgroud)
我还有一个标有DataContract/Member属性的类,我想让webservice方法接受.请注意,我的类包含一个也标有DataContract/Member属性的子类.
[DataContract]
public class MoreData{
[DataMember]
public string SomeString { get; set; }
[DataMember]
public SubClass SubData {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我的方法声明如下:
[OperationContract]
[WebInvoke( Method = "POST", UriTemplate = "/api/{something}/{id}")]
public MyWebSvcRetObj Update(string something, string id)
Run Code Online (Sandbox Code Playgroud)
我如何让我的Update方法也接受MoreData类?我已经能够编写如下方法:
[OperationContract]
[WebInvoke( Method = "POST")]
public MyWebSvcRetObj Update(MoreData IncomingData)
Run Code Online (Sandbox Code Playgroud)
但只有当URI没有指定任何参数时,URI才会显示
"api/Update"
Run Code Online (Sandbox Code Playgroud)
最终,我希望我的用户能够像:
$.ajax({
url: 'localhost/site/api/things/12345
type: 'POST'
data: {
SomeString: 'I am a string'
SubData: {
//...more data
}
}
});
Run Code Online (Sandbox Code Playgroud)
我已经尝试将Stream作为Update方法中的最后一个参数,但这似乎不适用于具有子类的类,如我给出的示例.它最终具有键/值对,如"SubData [SomeSubDataProp]":"Val".这对我来说似乎不对.我还尝试在Update方法中添加一个MoreData参数作为最后一个参数,但是我得到一个错误,表示它期待一个流(因为它期望原始数据).我正在尝试做什么?或许我会以错误的方式解决这个问题?
UPDATE
正如Faizan Mubasher所写,如果我的网络方法如下所示,我的用户将能够发送帖子数据:
[OperationContract]
[WebInvoke( Method = "POST", …Run Code Online (Sandbox Code Playgroud) 我的问题与此类似,但有一个有趣的区别。我已经明确定义了所有值,但仍然无法正常工作。如果可能,我也尽量避免使用合同属性。
所以这一切看起来像什么。我定义了一个具有枚举类型的属性的合同。枚举是
public enum ErrorCodes
{
GeneralError = 1,
ValidationError = 2,
AuthenticationError = 3
}
Run Code Online (Sandbox Code Playgroud)
然后客户端因错误而失败:
System.ServiceModel.CommunicationException: An error occurred while receiving the HTTP response to http://localhost/MyTestAppService/SomeService.svc/soap. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details. ---> System.Net.WebException: The underlying connection was closed: An …Run Code Online (Sandbox Code Playgroud) datacontract ×10
wcf ×7
c# ×6
.net ×1
automapper ×1
datagrid ×1
enums ×1
itemssource ×1
lambda ×1
performance ×1
rest ×1
silverlight ×1
web-services ×1
wpf ×1
xsd ×1