Articles of #wcf

使用WAS将Autofac与WCF服务一起使用

我喜欢通过在配置文件中设置serviceActivations来托管没有.svc文件的服务的WCF 4.0function。 它使用默认服务工厂工作得很好但现在我正在尝试使用AutofaServiceHostFactory执行相同操作,因此我的依赖项将被正确注入。 在我尝试的所有场景中,当我尝试访问服务时仍然遇到此错误: 为WCF配置的服务“WCFAutofacWiring.MyService”未向Autofac容器注册 。 我在一个空的asp.net网站上托管我的服务。 这是我做的: Web.config: 然后,我在app_code文件夹中放置一个文件来注册我的依赖关系,如Autofac文档( Autofac WcfIntegration )中所述,我向调试器确认在服务启动时调用了代码: public static class AppStart { public static void AppInitialize() { AutofacHostFactory.Container = new AutofacBootstrapper().Configure(); } } 最后,这是我的注册: public class AutofacBootstrapper { public IContainer Configure() { var builder = new ContainerBuilder(); // register types builder.Register(x => new MyLanguageProvider(“en-US”)); builder.RegisterType(); return builder.Build(); } } […]

如何使用CodeDom创建一个接口方法

我正在使用CodeDom生成我的WCF服务接口和实现文件。 我在CodeMemberMethod上找不到任何可以生成接口方法的选项。 如果我使用MemberAttributes.Abstract,我几乎就在那里,但它包含对接口无效的abstract关键字。 有谁知道生成方法的正确语法? 这是我为生成接口文件而开发的代码:private void CreateServiceContractFile(Type entity,BoElement bo,DirectoryInfo serviceOutputDir,AppParameters appPrams){CodeCompileUnit serviceFileUnit = new CodeCompileUnit(); CodeNamespace importNameSpace = new CodeNamespace(“”); importNameSpace.Imports.Add(new CodeNamespaceImport(“System”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.Collections.Generic”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.Linq”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.Runtime.Serialization”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.ServiceModel”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.ServiceModel.Web”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.Text”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“ALVIN.BusinessObjects”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“DAOObjects = ALVIN.DAO”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“ALIAS.BusinessObjects”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.Data.Entity.Validation”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.ComponentModel.DataAnnotations”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“System.Data.Objects”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“ALIAS.Common.Utility”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“ALIAS.EventMessages”)); importNameSpace.Imports.Add(new CodeNamespaceImport(“ALIAS.ServiceCommon”)); importNameSpace.Imports.Add(new […]

禁止WCF客户端证书和用户名凭据

我在让WCF客户端连接到需要客户端证书和用户名/密码的服务器时遇到问题。 我已经validation使用JUST客户端证书使用此方法: var binding = new WSHttpBinding(SecurityMode.Transport); binding.Security.Transport = new HttpTransportSecurity(); binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; var ea = new EndpointAddress(EndpointUrl); using (var p = new ServiceReference1.AAAClient(binding, ea)) { try { p.ClientCredentials.ClientCertificate.SetCertificate( System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser, System.Security.Cryptography.X509Certificates.StoreName.My, System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName, CertificateSubject); var x = p.RequiresClientCertificateOnly(); Console.WriteLine(“Status: ” + x.status); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.WriteLine(); } 下一个合乎逻辑的步骤是添加用户名/密码部分,但它返回403未经授权。 我知道凭证和证书是有效的,因为我在中间使用fiddler提供客户端证书和用户名/密码,它工作正常,只是当通过WCF使用它似乎不起作用,或使用发送两个客户端证书和用户名/密码。 尝试使用两者的代码如下(尝试使用WSHttpBinding和BasicHttpBinding – […]

WCF服务如何与我的winform应用程序交互?

我目前正在开发一个C#Windows窗体应用程序,我打算让它与服务器进行交互。 服务器将从我开发的移动应用程序接收发布,并且每当收到发布时,我的Windows窗体应用程序应该得到通知并给我通知。 为此,我打算为它使用WCF双工服务。 例如,我的移动应用程序发送一个post到我的服务器。 一旦我的服务器读取并接收新的post,该服务应该向我的winform应用程序发送一条消息,提醒我收到了一个post。 winform应用程序的UI应根据我想要更新的内容进行更新。 (例如添加新面板) 这基本上是我希望它能够工作的方式 WCF服务在我的服务器上运行 Windows窗体使用双工合同连接到我的服务器的WCF服务 移动应用程序发布到网页 一旦网页收到发布,asp.net将调用WCF服务 WCF双工服务接收发布并将信息发送到winform应用程序 我的winform应用程序又名WCF客户端使用收到的这条新消息更新UI 我的问题是,第4步如何进入第5步? 具体而言,服务如何在收到发布后将信息发送到winform应用程序。 更具体地说,一旦从网页接收到发布,就调用服务合同并且服务发送和接收信息,服务如何利用回叫信道将信息发送到winform。应用程序并相应地更新UI?

如何获取WCF Web服务的IP地址

从C#客户端(System.ServiceModel.ClientBase 的实例)调用WCF Web服务时,如何获取我连接的服务器的IP地址? 上下文:我们为一些WCF服务设置了一个Web服务器场,我需要知道在发生exception时我连接到哪个特定服务器。

控制WCF XML输出中的命名空间前缀

我的WCF服务的当前输出如下(只有一部分显示如下): STATE_CD 1 STATE_CD_TXT Alabama STATE_CD_SHORT_TXT AL 在该示例中,对于每个US状态重复“RowDetail”元素。 我有两个问题: 如何删除标签中的“a:”前缀。 我假设我需要更改xmlns设置,但我不知道如何在不抛出错误的情况下执行此操作。 我查看了其他线程,但无法使其工作。 是否可以从输出中删除无关元素,即“行”和“字段”? 我理解为什么他们在那里 – 这是由于我如何设置我的课程(下面发布),但看看IMO是很麻烦的。 类别: [DataContract] public class Results2Detail { [DataMember] public RowDetail[] Rows; } [DataContract] public class RowDetail { [DataMember] public FieldDetail[] Fields; } [DataContract] public class FieldDetail { [DataMember] public String name; [DataMember] public String value; }

Process.Start没有创建子进程(端口句柄inheritance)?

我在使用TCP绑定的自托管应用程序中有一个WCF服务。 如果我从应用程序启动外部进程“commandLineApp”,即使在我的应用程序关闭后仍然继续,我的应用程序下次启动WCF服务时会遇到问题。 WCF说地址/端口已经在使用中。 如果在重新启动应用程序之前关闭外部应用程序(根本不使用WCF或任何套接字),WCF服务就可以正常启动。 看起来我的应用程序中的套接字句柄以某种方式由新进程“commandLineApp”inheritance,并且在该进程退出之前不会被释放。 如何阻止其他进程从我的主应用程序inheritance句柄(或成为子进程?)? 目前我正在使用Process.Start启动其他进程,使用UseShellExecute设置为False,因为我需要设置EnvironmentVarables和RedirectStandardOutput / Error。 我认为如果我设置UseShellExecute = true,则会阻止子进程设置,但是我没有得到我需要的所有function。 有没有解决这个问题的方法? 请参阅下面的示例代码 ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = “commandLineApp.exe”; psi.Arguments = “/someParameter”; psi.EnvironmentVariables.Add(“…”, “…”); psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; psi.UseShellExecute = false; Process process = new Process(); process.StartInfo = psi; process.Start(); // Monitor if process with PID = process.Id is running […]

使用WCF服务返回List

我有一个Employee类,每个员工都有一个应用的叶子列表。 是否可以将列表AppliedLeave作为WCF中的[DataMember] ? [DataContract] public class Employee { [DataMember] public string UserID { get; set; } [DataMember] public int EmployeeNumber { get; set; } [ForeignKey(“EmployeeUserID”)] [DataMember] public List AppliedLeave { get { return _appliedLeaves; } set { _appliedLeaves = value; } } private List _appliedLeaves = new List(); … } 有没有其他方法可以做到这一点? 谢谢你对此事的考虑 我延伸我的问题 这是我的休假class: [DataContract] […]

如何编写T4模板以从Entityframework 6创建DTO?

我有一个大型数据库,我在Entityframework中使用数据库优先模型。 它位于Internet服务器上并通过WCF进行通信。 域模型使用所有小写字母作为实体,存储过程和列/属性的名称。 在我的客户端应用程序中,我希望使用标准PascalCase作为命名约定。 T4模板是否可以使用正确的命名约定从Entityframework创建数据传输对象? 如果是这样,有人可以给我一个关于如何写它的起点吗? 为了清楚起见,我不想更改Entityframework生成的任何代码,而是使用Entityframework模型作为对另一个文件的输入添加具有相应CamelCase命名的简单POCO类,然后可以由WCF服务引用也许是Automapper(或类似的东西)。 谢谢你的任何建议。 数据库:PostgreSQL 9.5 数据库接口:Npgsql 3.0.5 .NET 4.5 Entityframework 6.0

WCF:远程服务器返回错误:(413)请求实体太大

我有一个wcf服务 有一个方法获取base64字符串来上传文件我的文件大小100kb它可能会更大的时间 我收到错误消息:远程服务器返回错误:(413)请求实体太大,同时尝试获取HttpWebResponse 这是我的wcf服务web.config 我的错是什么? 解决了 我发现我的错误,我删除这些代码 我认为https的传输模式,我们没有ssl所以我们不需要传输模式。 无论如何,我删除它,现在一切似乎都好