Tag: #wcf

WCF安全问题

我有一个应用程序访问托管在控制台应用程序中的服务器上的WCF服务。 我没有问题,当我尝试从另一台服务器上的控制台应用程序访问另一项服务时,我遇到了问题。 我正在使用TCP连接,我正在使用所有默认安全值。 所以我要从A-> B然后它从B-> C去死。 请注意,当我从A-> C出发时,一切都很好 错误:“对SSPI的调用失败”……“目标主体名称不正确”…堆栈跟踪… 在B打印出来的时候 Console.WriteLine(ServiceSecurityContext.Current.PrimaryIdentity.Name); Console.WriteLine(“ServiceSecurityContext.Current.WindowsIdentity.Name); 我可以看到这是我的Windows登录,这很好 因此,从B-> C开始,它似乎没有传递我的凭据 有任何想法吗?

我是否需要在WCF DataContract中公开构造函数,以使其在客户端上的对象实例化期间工作?

我在WCF服务中有一个类,我们称之为A。 A是数据协定,其中包含另一个自定义对象B的集合作为其DataMembers之一。 为了避免客户端的Null引用问题,我在构造函数中实例化BList ,如下所示: [DataContract] public class A { [DataMember] public String name { get; set; } [DataMember] public List BList {get; set; } public A() { BList = new List(); } } 我的问题是在客户端上,在客户端上创建A的对象后,此实例化不会发生并且BList显示为null。 我猜测构造函数没有出现在客户端上。 那么,我是否需要使构造函数成为一个明确的操作契约? 如果是这样会使客户看到他们不应该看到的内部事物,对吧? 如何确保此实例化在客户端上发生? 谢谢,对不起,如果这看起来像一个愚蠢的问题。

暴露net.tcp端点

我对如何在WCF中公开端点感到困惑 我有一个tcp端点和一个mex tcp端点。 当我尝试在服务主机中运行它时,我得到以下exception: 在服务MessageReaderService实现的合同列表中找不到合同名称“IMetadataExchange”。 添加ServiceMetadataBehavior到 配置文件或直接向ServiceHost启用对此合同的支持。 所以我从这个错误中得出结论,我需要添加一个服务行为来公开元数据。 所以我添加了这个行为: 但后来我得到了一个不同的错误: ServiceMetadataBehavior的HttpGetEnabled属性设置为true,HttpGetUrl属性是相对地址,但没有http基址。 提供http基址或将HttpGetUrl设置为绝对地址。 那么现在我必须实际添加另一个端点(http)以通过mexhttpbinding公开元数据? 是否有一种通过tcp公开端点的简单方法?

何时在WCF服务中调用析构函数

我需要创建一个维护WCF会话的服务。 在构造函数中,我从数据库中读取数据,当会话结束时,我必须将其保存回来。 如果我理解正确,当我在客户端上调用Close()时会话结束(我的客户端ServiceClient是使用SvcUtil.exe创建的)。 当我测试它时,我发现它有时在大约后被调用。 10分钟,有时20分钟后,有时甚至根本没有。 那么析构函数何时被调用? 服务 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class Service:IService { private User m_User = null; public Service() { m_User = User.LoadFromDB(); } ~Service() { m_User.SaveToDB(); } public void SetName(string p_Name) { m_User.Name = p_Name; } } Web.config文件 客户 ServiceClient serviceClient = null; try { serviceClient = new ServiceClient(); serviceClient.SetName(“NewName”); Console.WriteLine(“Name set”); […]

SqlConnection线程安全吗?

我有一个Log类,它将日志放在Windows日志和SQL表中。 为了优化我的代码,我想只使用一个SqlConnection 。 在MSDN中,它说:此类型的任何public static (在Visual Basic中为Shared)成员都是线程安全的。 任何实例成员都不保证是线程安全的。 我的问题是: private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 它是线程安全的吗? 如果是,使用Open()和Close() ? 如果没有,如何正确使用SqlConnection ? 这是我的完整类代码: private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); public static long WriteLog(string sSource, string sMessage, int iErrorCode, EventLogEntryType xErrorType) { // Windows Logs if (ConfigParameters.Instance.WindowsLog) EventLog.WriteEntry(sSource, sMessage, xErrorType, iErrorCode); // SQL Logs […]

从SAML令牌中读取SAML属性

我正在从XML文件加载SAML令牌。 string certificatePath = @”D:\Projects\SAMLDemo\Server.pfx”; X509Certificate2 cert = new X509Certificate2(certificatePath, “shani”); string samlFilePath = @”D:\Projects\SAMLDemo\saml.xml”; XmlReader reader = XmlReader.Create(samlFilePath); List tokens = new List(); tokens.Add(new X509SecurityToken(cert)); SecurityTokenResolver outOfBandTokenResolver = SecurityTokenResolver.CreateDefaultSecurityTokenResolver(new ReadOnlyCollection(tokens), true); SecurityToken securityToken = WSSecurityTokenSerializer.DefaultInstance.ReadToken(reader, outOfBandTokenResolver); SamlSecurityToken deserializedSaml = securityToken as SamlSecurityToken; 如何从deserializedSaml中读取SAML属性? 我需要属性的字符串值。

错误:WCF测试客户端不支持,因为它使用类型System.Threading.Tasks

我会发布这个问题,即使我发现很少有其他类似的问题。 但是,我无法找到令人满意的解决方案,无论是为什么我得到这个错误,也不知道如何解决它。 因此,今天我必须在我的本地计算机上托管服务以进行测试。 该服务是一个单一的WCF服务解决方案,据我所知,它已经工作了很长时间。 但是,当我下载项目并尝试在我的本地计算机上托管服务时,我从标题中得到错误: WCF测试客户端不支持此操作,因为它使用类型System.Threading 所以当我回到家时,我决定使用一些异步方法来提供服务,并深入了解这一点。 然而,当我在几乎没有使用(或者至少看起来如此) System.Threading.Tasks任何地方得到这个完全相同的错误时,我真的很惊讶。 所以我做了什么: 使用Visual Studio 2013默认模板创建新的WCF Service IService1.cs默认的IService1.cs文件和Service1.svc 将IService1.cs更改为: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace WcfService { [ServiceContract] public interface IService1 { [OperationContract] int GetEmpId(int id); } } 将Service1.svc更改为: 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Runtime.Serialization; 使用System.ServiceModel; 使用System.ServiceModel.Web; 使用System.Text; namespace WcfService {public […]

从webHttpBinding端点获取元数据

在参考我之前的问题时 ,我想知道如何从客户端应用程序中提取WCF服务的信息,以了解如果服务只公开一个使用webHttpBinding的端点,那么会暴露哪些方法/类型? 总而言之,在我之前的问题中,我开始知道使用webHttpBinding的端点不会在生成的WSDL中暴露,因为它将是一个JSON端点并且只是不兼容。

如何在.NET中自定义JSON枚举的反序列化?

我有以下示例C#代码,使用svcutils.exe应用程序从xsd自动生成。 [DataContract] public enum Foo { [EnumMember(Value = “bar”)] Bar = 1, [EnumMember(Value = “baz”)] Baz = 2 } [DataContract] public class UNameIt { [DataMember(Name = “id”)] public long Id { get; private set; } [DataMember(Name = “name”)] public string Name { get; private set; } [DataMember(Name = “foo”)] public Foo Foo { get; private […]

回调来自后台线程的WCF服务?

这是我的情况。 我编写了一个WCF服务,该服务调用我们供应商的代码库之一来执行操作,例如Login,Logout等。此操作的一个要求是我们有一个后台线程来接收由该操作引起的事件。 例如,Login操作在主线程上发送。 然后,由于登录,从供应商服务接收到多个事件。 可以收到1,2或几个事件。 在计时器上运行的后台线程接收这些事件并在wcf服务中触发事件以通知新事件已到达。 我已经在双工模式下实现了WCF服务,并计划使用回调来通知UI事件已到达。 这是我的问题:如何将后台线程中的新事件发送到正在执行服务的线程? 现在,当我调用OperationContext.Current.GetCallbackChannel() ,OperationContext为null。 有没有一个标准模式可以解决这个问题? 我在ServiceContract上使用PerSession作为我的SessionMode。 更新:我认为通过演示我如何从供应商代码接收事件,我会使我的确切情况更加清晰。 我的库接收每个事件,确定事件是什么,并触发该特定事件的事件。 我有另一个项目,它是一个专门用于连接供应商服务的类库。 我将发布服务的整个实现,以提供更清晰的图片: [ServiceBehavior( InstanceContextMode = InstanceContextMode.PerSession )] public class VendorServer:IVendorServer { private IVendorService _vendorService; // This is the reference to my class library public VendorServer() { _vendorServer = new VendorServer(); _vendorServer.AgentManager.AgentLoggedIn += AgentManager_AgentLoggedIn; // This is the eventhandler for the event […]