小编Dav*_*lle的帖子

在C#中,我如何捕获Web服务调用中使用的SOAP?

我有一个C#应用程序,它是Web服务的客户端.我的一个要求是允许捕获我发送的SOAP,这样如果出现问题,我可以修复错误,或者证明问题出在我正在调用的服务中.

我的WebReference代理服务类System.Web.Services.Protocols.SoapHttpClientProtocol像往常一样派生.如果我有一个魔杖,我会使这个基类实现一个OnPost我可以处理的事件,将SOAP写入我的日志并继续.

没有像WireShark那样运行数据包嗅探器,是否有一种简单的方法来获得这种级别的日志记录?

c# soap web-services

16
推荐指数
1
解决办法
7万
查看次数

TripleDES:指定密钥是'TripleDES'的已知弱密钥,无法使用

我正在使用.NET 3.0类System.Security.Cryptography.MACTripleDES类来生成MAC值.不幸的是,我正在使用一个使用" 1111111111111111"(作为十六进制)作为单长DES密钥的硬件设备.System.Security.Cryptography如果您尝试使用加密弱键,库会对键执行一些完整性检查并返回异常.

例如:

byte[] key = new byte[24];
for (int i = 0; i < key.Length; i++)
  key[i] = 0x11;

byte[] data = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte[] computedMac = null;
using (MACTripleDES mac = new MACTripleDES(key))
{
  computedMac = mac.ComputeHash(data);
}
Run Code Online (Sandbox Code Playgroud)

抛出一个例外

System.Security.Cryptography.CryptographicException : Specified key is a known weak key for 'TripleDES' and cannot be used.
Run Code Online (Sandbox Code Playgroud)

我知道这不是一个安全的密钥.在生产中,设备将使用新的安全密钥进行闪存.同时,有没有办法抑制这个异常被抛出?也许是一个app.config或注册表设置?

编辑:密钥实际上是101010 ...由于算法强制奇校验.我不确定这是DES算法的通用性还是我付款处理工作的要求.

编辑2:Daniel的答案下面有一些关于黑客.NET的非常好的信息.不幸的是,我无法使用这种技术解决我的问题,但仍然有一些有趣的阅读.

.net c# cryptography cryptographicexception

12
推荐指数
2
解决办法
1万
查看次数

WCF,BasicHttpBinding:停止新连接但允许现有连接继续

.NET 3.5,VS2008,使用BasicHttpBinding的WCF服务

我有一个Windows服务托管的WCF服务.当Windows服务因升级,定期维护等原因关闭时,我需要正常关闭我的WCF服务.WCF服务的方法可能需要几秒钟才能完成,而典型的卷每秒会有2-5个方法调用.我需要以允许任何先前调用方法完成的方式关闭WCF服务,同时拒绝任何新调用.通过这种方式,我可以在约5-10秒内达到安静状态,然后完成Windows服务的关闭周期.

调用ServiceHost.Close似乎是正确的方法,但它会立即关闭客户端连接,而无需等待任何正在进行的方法完成.我的WCF服务完成了它的方法,但没有人发送响应,因为客户端已经断开连接.这是此问题提出的解决方案.

以下是事件序列:

  1. 客户端使用VS生成的代理类调用服务方法
  2. 服务开始执行服务方法
  3. 服务收到关闭请求
  4. 服务调用ServiceHost.Close(或BeginClose)
  5. 客户端已断开连接,并收到System.ServiceModel.CommunicationException
  6. 服务完成服务方法.
  7. 最终服务检测到它没有更多的工作要做(通过应用程序逻辑)并终止.

我需要的是让客户端连接保持打开,以便客户知道他们的服务方法成功完成.现在他们只是获得了一个封闭的连接,并且不知道服务方法是否成功完成.在使用WCF之前,我使用套接字并且能够通过直接控制Socket来实现.(即在仍然执行接收和发送时停止接受循环)

关闭主机HTTP端口非常重要,以便上游防火墙可以将流量定向到另一个主机系统,但现有连接保持打开状态以允许现有方法调用完成.

有没有办法在WCF中实现这一目标?

我尝试过的事情:

  1. ServiceHost.Close() - 立即关闭客户端
  2. ServiceHost.ChannelDispatchers - 在每个上调用Listener.Close() - 似乎什么都不做
  3. ServiceHost.ChannelDispatchers - 在每个上调用CloseInput() - 立即关闭客户端
  4. 覆盖ServiceHost.OnClosing() - 让我延迟关闭,直到我决定关闭,但在此期间允许新的连接
  5. 使用此处描述技术删除端点.这抹去了一切.
  6. 运行网络嗅探器以观察ServiceHost.Close().主机只关闭连接,不发送任何响应.

谢谢

编辑:不幸的是,我无法实现系统正在关闭的应用程序级别的建议响应,因为该领域的客户端已经部署.(我只控制服务,而不是客户端)

编辑:我使用Redgate Reflector来查看Microsoft的ServiceHost.Close实现.不幸的是,它调用了internal我的代码无法访问的一些辅助类.

编辑:我还没有找到我想要的完整解决方案,但Benjamin建议在输入服务方法之前使用IMessageDispatchInspector拒绝请求.

c# wcf basichttpbinding communicationexception

11
推荐指数
1
解决办法
3176
查看次数

编写C#客户端以使用返回对象数组的Java Web服务

我正在编写一个C#客户端,它调用用Java编写的Web服务(由另一个人编写).我已经向我的客户端添加了一个Web引用,我可以在Web服务中调用方法.

服务已更改为返回对象数组,客户端无法正确解析返回的SOAP消息.

MyResponse[] MyFunc(string p)

class MyResponse
{
    long id;
    string reason;
}
Run Code Online (Sandbox Code Playgroud)

当我生成的C#代理调用Web服务(使用SoapHttpClientProtocol.Invoke)时,我期待一个长度为1的MyResponse []数组,即一个元素.在Invoke调用之后我得到的是一个id = 0和reason = null的元素,无论服务实际返回什么.使用数据包嗅探器,我可以看到服务正在返回似乎是合法的soap消息,其id和reason设置为非null值.

是否有一些技巧让C#客户端调用返回someobject []的Java Web服务?如有必要,我将努力获得一个消毒的演示.

编辑:这是通过"添加Web引用..."的Web引用.VS 2005,.NET 3.0.

c# java web-services

10
推荐指数
2
解决办法
2万
查看次数

System.Net(HttpWebRequest)跟踪而不使用文件或app.config?

我想在我的应用程序中捕获某些但不是全部的HttpWebRequest流量以进行调试.它是由IIS托管的Web服务.

我已阅读如何:配置网络跟踪.这很好用,但我不希望将跟踪指向文件,因为文件系统可能存在权限问题,数据敏感性等.我想直接捕获内存中的某些东西,我随后可以检查或加密和电子邮件.最好不要对app.config文件进行任何更改.

我尝试了以下内容,但显然我错过了将TextWriterTraceListener绑定到System.Net的步骤.如何将System.Net流量捕获到我的StringWriter中?

StringWriter sw = new StringWriter();
TextWriterTraceListener myListener = new TextWriterTraceListener(sw);
Trace.Listeners.Add(myListener);
HttpWebRequest req = (HttpWebRequest) WebRequest.Create("http://www.microsoft.com");
HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
Stream s = resp.GetResponseStream();

byte[] buf = new byte[4096];
while (s.Read(buf, 0, buf.Length) > 0) ;
s.Close();

myListener.Flush();
sw.Flush();
Run Code Online (Sandbox Code Playgroud)

编辑:具体来说,我想在运行时做此等价的,不过我不想输出去network.log,我想它去我已经建立了用于此目的的字符串缓冲区.

<configuration>

<system.diagnostics>

<sources>
  <source name="System.Net.Sockets" tracemode="includehex">
    <listeners>
      <add name="System.Net.Sockets" type="System.Diagnostics.TextWriterTraceListener" initializeData="network.log" />
    </listeners>
  </source>
</sources>

<switches>
  <add name="System.Net.Sockets" value="Verbose"/>
</switches>

<trace autoflush="true" />
</system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud)

c# trace asp.net-2.0 httpwebrequest

10
推荐指数
2
解决办法
1万
查看次数

LINQ如果数组为空则返回null

public class Stuff
{
  public int x;
  // ... other stuff
}
Run Code Online (Sandbox Code Playgroud)

我有一个IEnumerable<Stuff>和我想建立一个int[]所有的x所有的属性Stuff集合中的对象.

我做:

IEnumerable<Stuff> coll;
// ...
var data = coll.Select(s => s.x).ToArray();
Run Code Online (Sandbox Code Playgroud)

我想要的是一个空数组,而不是int[0]如果该集合为空.换句话说,如果!coll.Any(),那么我想要data = null.(我实际需要的是coll复杂LINQ表达式的中间结果,我想在表达式链上使用LINQ操作,而不是保存中间结果)

我知道这int[0]null在许多情况下更令人满意,但我存储了许多这些结果,并且宁愿传递而nulls不是空数组.

所以我目前的解决方案是这样的:

var tmp = coll.Select(s => s.x).ToArray();
int[] data = tmp.Any() ? tmp : null;
Run Code Online (Sandbox Code Playgroud)

没有存储的任何方式tmp吗?

编辑:主要问题是如何在不存储中间结果的情况下执行此操作.喜欢的东西NULLIF()T-SQL那里你回到你所传递的,如果条件是假的,NULL如果条件为真.

c# linq linq-to-objects

7
推荐指数
1
解决办法
6570
查看次数