我有一个WCF服务,其中一个方法返回Stream.现在的问题是当我尝试使用Stream对象时,我是否尝试通过网络使用流或者客户端已经收到了自己的整个流?
如果我使用RESTful而不是WCF,它会有什么不同吗?
要使用配置文件执行上述操作,我会这样做:
<endpoint
address="...."
binding="netTcpBinding"
bindingConfiguration="MyBinding"
contract="IService1">
<identity>
<servicePrincipalName value="name"/>
</identity>
</endpoint>
Run Code Online (Sandbox Code Playgroud)
但是如何将其添加到下面的代码中?
Uri uri = new Uri("http://example.com/service");
ServiceHost host = new ServiceHost(typeof(Service1), uri);
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
host.AddServiceEndpoint(typeof(IService1), binding, uri);
host.Open();
Run Code Online (Sandbox Code Playgroud) 我正在尝试克服WCF和枚举的问题,我正在尝试将对象从服务器传递到包含枚举的客户端(或其他服务器).枚举以1开头,故意.枚举初始化时以及在其中定义值时,一切都很顺利,但是当它未在枚举中定义时,我得到了这个非常好的(并且非常具有描述性(...))错误消息:
"底层连接已关闭:连接意外关闭."
我试图实现的是当我得到这个场景时,无论是从数据库中的损坏数据(无论如何都被转换为枚举,这是非常奇怪的),或者当开发人员忘记在启动对象时设置枚举值时,要获得有意义的消息,例如"枚举值无效,请键入:{0},值:{1}".
我试图在类的枚举和getter中使用"Enum.IsDefined",并将有意义的异常抛给客户端(或其他服务器),但仍然出现"连接关闭"错误(当允许调试服务器我得到了有意义的消息,但仅在服务器端).
这是enum setter和getter的片段:
private TestEnum m_TestEnum;
[DataMember]
public TestEnum TestEnum
{
get
{
if (Enum.IsDefined(typeof(TestEnum), m_TestEnum))
{
return m_TestEnum;
}
else
{
throw new ApplicationException("Enum value is not valid: " + m_TestEnum);
}
}
set
{
if (Enum.IsDefined(typeof(TestEnum), value))
{
m_TestEnum = value;
}
else
{
throw new ApplicationException("Enum value is not valid: " + value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
从0开始枚举(带有"未知"值)不够好,因为我仍然可以获得枚举中不存在的值.我可以结合两种解决方案,我检查"IsDefined"并将枚举设置为"未知"值,但仍然 - 这不是理想的解决方案,因为我们想知道这些情况,以便在开发周期中解决它们.
你说什么?谢谢,Nir.
有没有办法获取cleint的主机名在WCF中调用net.tcp绑定.我正在尝试诊断一个问题,我想找出哪个客户端正在向我发送导致它的消息.
我试过了:
OperationContext.Current.Channel.RemoteAddress.Uri.AbsoluteUri
Run Code Online (Sandbox Code Playgroud)
但这似乎只给我一个通用架构而不是主机名/ IP地址.
我有两个服务,名为TemplateService,TemplateReportService(都在一个WCF服务库中定义)将公开给客户端应用程序.
是否可以在一个Windows服务下托管这两个服务?
谢谢!
我试图将类型的列表对象传递给List<UploadQueue>相同参数类型的WCF SOAP方法,我收到错误:
无法从'System.Collections.Generic.List'转换为'WebAPI.Upload.UploadQueue []'
我不明白这一点,因为我的WCF方法(下面)参数类型是List<UploadQueue>:
IService.DoUpload(List<UploadQueue> request)
Run Code Online (Sandbox Code Playgroud)
这是调用"DoUpload"的代码,它返回上述错误.
List<UploadQueue> results = new List<UploadQueue>();
HttpPostedFile m_objFile = default(HttpPostedFile);
int m_objFlag = default(int);
Guid m_objGuid = Guid.NewGuid();
DateTime m_objDate = DateTime.Now;
try
{
if (Request.Files.Count > 0)
{
for (var j = 0; i <= (Request.Files.Count - 1); j++)
{
m_objFile = Request.Files[j];
if (!(m_objFile == null | string.IsNullOrEmpty(m_objFile.FileName) | m_objFile.ContentLength < 1))
{
results.Add(new UploadQueue(
m_objGuid,
m_objFlag,
m_objFile.ContentLength,
m_objFile.FileName,
m_objDate)
);
}
}
}
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 那么哪一个是新的,为什么我会使用一个而不是另一个.或者更重要的是,通过Windows窗体?
在我的新WPF/silverlight应用程序中,最好是直接连接到我的远程SQL Server(我使用linq到sql),还是调用WCF服务并让服务连接到数据库更好?
SQL Server和Win2k8 Web服务器都是租用的,位于同一位置.如果创建WCF服务,我会在Web服务器上运行它并连接到隔壁的数据库.我不关心重用这项服务的能力,但我关心的是性能.最好是直接从我的客户端进行SQL调用,还是调用服务并让服务进行调用.
我们希望在我们的WCF服务后面使用NHibernate,但是我们在将子记录删除持久保存到数据库时遇到问题.
我们在服务和客户端之间使用DTO,它们具有IList <>作为子集合类型.当我们使用NHibernate填充DTO时,它将子集合设置为Bag的类型.但是,当通过线路发送时,WCF会将此集合类型更改为Array.
如果我们从数组中删除一条记录并将其传回服务,NHibernate将不会将删除持久保存到数据库中.
有没有我们可以告诉NHibernate(在映射?)删除数组中不存在的任何子记录?
我正在IIS中使用basicHttpBinding实现wcf web服务托管,这些应该可以通过.net 2.0客户端访问,如访问ASMX服务.
任何机构都可以提供详细信息,并提供一些示例/示例代码.
谢谢
你
wcf ×10
c# ×4
.net ×3
wpf ×2
enums ×1
generics ×1
host ×1
list ×1
nhibernate ×1
service ×1
sql-server ×1
stream ×1
wcf-client ×1
web-services ×1
winforms ×1