我正在开发一个WCF Web服务,我使用WCF服务应用程序模板来做到这一点.
创建"WCF服务应用程序"是否满足此要求?通过WCF服务应用程序创建WCF服务库有什么好处?
我在使用从Windows服务到我的Web服务器上运行的WCF服务的WCF调用时遇到问题.这个电话已经工作了好几个星期,但后来突然停止了工作,此后一直没有工作.
我得到的例外是:
发生常规错误System.ServiceModel.CommunicationException:发出HTTP请求时发生错误
然后它说
这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书.这也可能是由客户端和服务器之间的安全绑定不匹配引起的.
我在两端使用的安全性是wsHttpBinding,没有任何加密.它也只是使用HTTP - 而不是HTTPS,所以我不确定它为什么抱怨HTTPS.
内部异常堆栈的其余部分是:
SystemNet.WebException:基础连接已关闭:发送时发生意外错误.---> System.IO.IOException:无法将数据写入传输连接:提供了无效参数.---> System.Net.Sockets.SocketException:在System.Net.Sockets.NetworkStream.MultipleWrite(BufferOffsetSize [])的System.Net.Sockets.Socket.MultipleSend(BufferOffsetSize [] buffers,SocketFlags socketFlags)中提供了无效参数.缓冲区)
我还应该注意到,我的程序中发生这种情况的点是在Web服务调用的"执行"行 - 也就是说,只要我调用Web服务并将其传递给包装的DataContract对象,它炸毁.
所有这些服务正在做的是传递大量的XML(作为.NET对象传递给客户端的调用),然后它做了一些工作.可能正在传输大约100-200k的XML.我已经将两端数据大小的限制提高到超过6兆,但这似乎没有帮助.
有任何想法吗?
有关此问题的更多信息:
当我们在本地复制客户端环境时,我们发现除非我们进行以下更改,否则我们无法上传大量的XML:1.在服务器上,将"maxRequestLength"设置为100 MB(比我们发送的方式更高)2.在客户端,我们将dataContractSerializer标记下的maxItemsInObjectGraph的值设置为"2147483646".
通过这些更改,我们的本地安装成功上传.但是,客户端在其服务器上的安装仍然失败.有趣的是,一旦我们在服务器上更改了maxRequestLength值,我们的测试安装就会开始抛出一个与maxItemsInObjectGraph设置有关的错误.而在我们客户端的服务器上,仍然发生原始的"HTTP.sys"错误.
正如我之前提到的,我们根本没有使用SSL,还有2个其他Web服务调用以相同的方式执行和上传XML.但是,由于非工作服务呼叫传输更多数据,这似乎是一个大小问题.
但是,如果客户端遇到的问题与我们的测试安装相同,我不明白为什么客户端错误消息与ObjectGraph错误无关.
是否有可能我们只是为客户端上的每个可能的错误获取通用的"无效参数""HTTP.sys"错误(即它真的得到了objectGraph错误,但只是没有显示它?)
我试图通过其相应的wsdl使用Web服务.此服务依赖于符合Web服务安全基本安全配置文件1.0的身份验证,包括http://docs.oasis-open.org/wss/2004/01/oasis-200401wss-wssecurity-secext-1.0的正确xmls命名空间. xsd必须包含在请求中.
例:
<wsse:UsernameToken xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' >
<wsse:Username>
Bob
</wsse:Username>
<wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>
1234
</wsse:Password>
</wsse:UsernameToken>
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试是Add Service Reference
针对wsdl以及使用它们生成的代理
ServicePointManager.ServerCertificateValidationCallback =
(object s, X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslPolicyErrors) => true;
var basicHttpBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
basicHttpBinding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.Basic;
var endpoint = new EndpointAddress("https://secure-ausomxana.crmondemand.com/..."
using (var client = new ContactClient(basicHttpBinding, endpoint))
{
var credential = client.ClientCredentials.UserName;
credential.UserName = "bob";
credential.Password = "1234";
var input = ...
var output = client.ContactQueryPage(input);
}
Run Code Online (Sandbox Code Playgroud)
但是,尝试使用Fiddler查询SOAP消息时,我发现没有添加任何UsernameToken元素.
履行这份合同的正确方法是什么?
编辑: …
我正在尝试实现一个纯WCF场景,我想在不依赖SDK帮助程序类的情况下调用Dynamics CRM WCF服务.基本上,我想使用.net框架中的本机WCF支持对Dynamics CRM 2011实施联合身份验证.
我这样做的原因是我想稍后将这个场景移植到BizTalk上.
我已成功使用SvcUtil生成代理类,但部分策略和安全性断言与配置架构不兼容.SvcUtil建议从代码构建绑定,这正是我想要做的.
结果代码在这里:
private static void CallWcf()
{
OrganizationServiceClient client = null;
try
{
// Login Live.com Issuer Binding
var wsHttpBinding = new WSHttpBinding();
wsHttpBinding.Security = new WSHttpSecurity();
wsHttpBinding.Security.Mode = SecurityMode.Transport;
// Endpoint Binding Elements
var securityElement = new TransportSecurityBindingElement();
securityElement.DefaultAlgorithmSuite = SecurityAlgorithmSuite.TripleDes;
securityElement.IncludeTimestamp = true;
securityElement.KeyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy;
securityElement.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
securityElement.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
var securityTokenParameters = new IssuedSecurityTokenParameters();
securityTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
securityTokenParameters.ReferenceStyle = SecurityTokenReferenceStyle.Internal;
securityTokenParameters.RequireDerivedKeys = false;
securityTokenParameters.TokenType = …
Run Code Online (Sandbox Code Playgroud) 我正在阅读有关WCF安全实现的内容,并发现有两种类型的安全性:
Transport Mode and Message Mode (or both)
如果我使用HTTPS进行传输模式,如果我也使用Message安全性,它会更安全吗?我问这个,因为我的理解如下:
https使用加密消息的SSL协议......那么我为什么要添加Message Security并加密SSL加密消息?还是我误解了什么?
我遇到Visual Studio 2013和我们的公司代理问题(登录不起作用,更新不起作用,Visual Studio库不起作用,nuget和git失败).所有这些都在做http或https请求.(例如http://visualstudiogallery.msdn.microsoft.com/).在VS2013中,我只是获得了旋转进度条或没有网络连接的消息.
浏览器(chrome,IE,firefox)没问题,因为他们都理解代理(407拒绝,然后用凭据回复).
所以我想弄明白为什么VS2013不起作用.但是当我告诉fiddler2观看DEVENV.EXE进程(或所有进程)时,我看不到任何流量.
顺便说一下,我已经尝试对web.config(devenv.exe.config)文件进行一些更改,以确保它转到代理(我在堆栈生成器中看到了这个),但它对我不起作用.请参阅以下部分的补充内容:
<system.net>
<defaultProxy useDefaultCredentials="true" enabled="true">
<proxy proxyaddress="http://gw6.OURSITE.com:3128" />
</defaultProxy>
<settings>
<ipv6 enabled="true"/>
<servicePointManager expect100Continue="false" />
</settings>
</system.net>
Run Code Online (Sandbox Code Playgroud)
埃里克,我接受了你的建议并把它塞进C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe.config
文件中.
我放的是:
<system.net>
<defaultProxy useDefaultCredentials="true" enabled="true">
<proxy autoDetect="false" bypassonlocal="false" proxyaddress="http://127.0.0.1:8888" usesystemdefault="false" />
</defaultProxy>
</system.net>
Run Code Online (Sandbox Code Playgroud)
我发现VS2013没有发送用户代理字符串.它确实知道#407 naks并且它使用凭据进行回复,但网关仍然需要用户代理:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Proxy-Connection: close
Connection: close
Content-Length: 1341
<html>
<head>
<title>Access Policy Denied: No User-Agent Specified</title>
<meta name="description" content="Web Access Policy">
</head>
<body>
Run Code Online (Sandbox Code Playgroud) 之间有什么区别security mode="Transport"
和security mode="TransportCredentialOnly"
当我使用它BasicHttpBinding
在ISS 7.0和安装SSL?
我正在使用WCFTestClient来调试服务.这通常像魅力一样.此特定服务使用SSL,我需要传递用户名和密码.我可以右键单击并编辑配置文件,但是我没有看到可以注入用户名和密码的地方.在此服务的普通客户端应用程序上,我们以编程方式设置凭据,如何使用工具WCFTEstClient或ServiceConfigurationEditor执行此操作.那里的任何人都知道如何做到这一点?这是我在代码中的表现.
_client.ClientCredentials.UserName.UserName = ConfigurationManager.AppSettings["name"];
_client.ClientCredentials.UserName.Password = ConfigurationManager.AppSettings["pass"];
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
干杯,
〜在圣地亚哥
关于WCF和安全问题我正在四处走动,所以我只想在这里提出一大堆问题,希望有人能帮助我获得清晰的图片.
有人可以给我一个关于传输与消息级安全性的简单英文解释.
我想我有一个在SSL下运行的服务,它将根据用户的Windows凭据对用户进行身份验证.我也想我知道如何限制访问通过一个的PrincipalPermission服务方法.但是我如何实际检索当前的IPrinciple,所以我可以根据谁调用服务返回不同的结果?
我已经找到了如何打开跟踪,我可以使用"Microsoft服务跟踪日志查看器"查看我的跟踪日志,但如果我能弄清楚我正在显示什么,那就太糟糕了.有没有一个很好的资源解释如何使用这个东西?
使用"证书"clientCredentialType时,这与SSL有什么不同?
使用"Windows"clientCredentialType时,如何查看正在通过的Windows用户?
我的要求意味着我必须使用basicHttpBindings - 我在假设中是正确的:
我知道这些问题可能看起来很愚蠢,但任何有关澄清的帮助都会有所帮助.
编辑:
编辑:
除了上述问题之外,我想知道是否可以通过检查Active Directory来验证基于Windows用户的Windows移动设备.对于迄今为止我发现的所有内容,似乎不太可能.
注意:对于那些不知道Windows CE版本的WCF可用的人:仅限传输级别安全性,以及客户端凭据类型的无/证书.所以看来CE的WCF默认不允许这样做,但是我可以安全地在消息中发送这些信息(通过方法签名),这是否是一种可接受的方式来发送这种信息?
我试图弄清楚如何在Web场方案中使用WCF实现重放攻击检测机制.
WCF通过使用nonce缓存提供这种检测机制.如果我错了,请纠正我,但确保在邮件安全和Web场方案中防止此攻击的唯一方法是使用跨服务器共享的nonce缓存.
在WSE3.0中,过去可以提供nonce缓存自定义实现
http://msdn.microsoft.com/en-us/library/ff647945.aspx
但是在WCF中似乎没有任何方法可以这样做(没有配置选项,除了我在Reflector中发现NonceCache类被标记为密封和内部..)
有什么想法吗?
wcf-security ×10
wcf ×9
c# ×3
security ×3
web-services ×2
asp.net ×1
fiddler ×1
ntlm ×1
proxy ×1
service ×1
wcf-binding ×1
wcf-client ×1
ws-security ×1
xml ×1