WCF和Assembly.GetExecutionGassembly

WCF和Assembly.GetExecutionGassembly,wcf,.net-assembly,Wcf,.net Assembly,我需要确认我的wcf服务的调用代码没有被篡改。 调用代码位于客户端pc上的一个dll文件中。我通过Assembly.getExecutionGassembly()获取调用代码 为了进行一些测试,我在我的wcf服务中创建了一个名为GetChecksum的方法,以通过他的校验和验证调用代码的完整性。 但是要做好这项工作,我需要在调用完成时将正在执行的程序集发送到我的wcf服务 服务器上的缩短代码如下所示: [ServiceContract] [ServiceKnownType(typeof(Syst

我需要确认我的wcf服务的调用代码没有被篡改。 调用代码位于客户端pc上的一个dll文件中。我通过Assembly.getExecutionGassembly()获取调用代码

为了进行一些测试,我在我的wcf服务中创建了一个名为GetChecksum的方法,以通过他的校验和验证调用代码的完整性。 但是要做好这项工作,我需要在调用完成时将正在执行的程序集发送到我的wcf服务

服务器上的缩短代码如下所示:

[ServiceContract]
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public interface IContrato
{
    [OperationContract]
    Byte[] GetChecksum( Object obj, out String debugging);
}


[ServiceKnownType(typeof(System.Reflection.Assembly))]
public class RegisterIndiNT : IContrato
{
    Boolean GetChecksum( Object o, out String debugging )
    {
        // code to cast Object to Assembly and to compute the checksum.
    }
}
Uri uri = new Uri(@"http://mywebserver.com/RegisterIndiNT.svc");
WCFOnlyContract.IContrato proxy = ChannelFactory<WCFOnlyContract.IContrato>.CreateChannel(
                new BasicHttpBinding(), new EndpointAddress(uri));

(proxy as ICommunicationObject).Open();

String debugging = String.Empty;
result = proxy.GetChecksum( Assembly.GetExecutingAssembly(), out debugging);

(proxy as ICommunicationObject).Close();
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
  if (info==null)
    throw new ArgumentNullException("info");

  Contract.EndContractBlock();

  UnitySerializationHolder.GetUnitySerializationInfo(info,   UnitySerializationHolder.AssemblyUnity, 
  this.FullName, 
  this);
}

internal static void GetUnitySerializationInfo(
            SerializationInfo info, int unityType, String data, RuntimeAssembly assembly)
{
  info.SetType(typeof(UnitySerializationHolder));
  info.AddValue("Data", data, typeof(String));
  info.AddValue("UnityType", unityType);

  String assemName;

  if (assembly == null) 
     assemName = String.Empty;
  else 
     assemName = assembly.FullName;

  info.AddValue("AssemblyName", assemName);
}
缩短的调用代码如下所示:

[ServiceContract]
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public interface IContrato
{
    [OperationContract]
    Byte[] GetChecksum( Object obj, out String debugging);
}


[ServiceKnownType(typeof(System.Reflection.Assembly))]
public class RegisterIndiNT : IContrato
{
    Boolean GetChecksum( Object o, out String debugging )
    {
        // code to cast Object to Assembly and to compute the checksum.
    }
}
Uri uri = new Uri(@"http://mywebserver.com/RegisterIndiNT.svc");
WCFOnlyContract.IContrato proxy = ChannelFactory<WCFOnlyContract.IContrato>.CreateChannel(
                new BasicHttpBinding(), new EndpointAddress(uri));

(proxy as ICommunicationObject).Open();

String debugging = String.Empty;
result = proxy.GetChecksum( Assembly.GetExecutingAssembly(), out debugging);

(proxy as ICommunicationObject).Close();
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
  if (info==null)
    throw new ArgumentNullException("info");

  Contract.EndContractBlock();

  UnitySerializationHolder.GetUnitySerializationInfo(info,   UnitySerializationHolder.AssemblyUnity, 
  this.FullName, 
  this);
}

internal static void GetUnitySerializationInfo(
            SerializationInfo info, int unityType, String data, RuntimeAssembly assembly)
{
  info.SetType(typeof(UnitySerializationHolder));
  info.AddValue("Data", data, typeof(String));
  info.AddValue("UnityType", unityType);

  String assemName;

  if (assembly == null) 
     assemName = String.Empty;
  else 
     assemName = assembly.FullName;

  info.AddValue("AssemblyName", assemName);
}
Uri=新的Uri(@“http://mywebserver.com/RegisterIndiNT.svc");
WCFOnlyContract.IContrato proxy=ChannelFactory.CreateChannel(
新的BasicHttpBinding(),新的端点地址(uri));
(代理作为ICommunicationObject).Open();
字符串调试=String.Empty;
结果=proxy.GetChecksum(Assembly.getExecutionGassembly(),out debug);
(代理作为ICommunicationObject)。关闭();
错误发生在调用中,在进入校验和方法内部之前。 似乎无法序列化System.Reflection.Assembly类型。 我已将此类型添加到knowntypes属性(接口和类),但不起作用。我得到了下一个例外:

< P>异常。消息=错误 obj。内尔弗耶酒店 “无se espera el tipo”系统。反射。运行时程序集“con el nombre de contrato de datos”运行时程序集:”。如果是数据合同序列化程序,则计划使用数据合同解决程序o agregar tipos no conocidos estáticament a la lista de tipos conocidos a a por ejempo,usando el atributo knownyteparticle o agrega la lista de tipos conocidos que se pasa datacontract serializer)。”。帕拉奥普滕·马斯·información领事馆

我需要程序集的序列化在客户端代码之外进行。 将客户端上的程序集发送到wcf后将其序列化为非解决方案


任何帮助都是非常感谢的。提前感谢。

您是正确的,因为它并没有像您期望的那样序列化

类程序集实现ISerializable

GetObjectData的实现方式如下:

[ServiceContract]
[ServiceKnownType(typeof(System.Reflection.Assembly))]
public interface IContrato
{
    [OperationContract]
    Byte[] GetChecksum( Object obj, out String debugging);
}


[ServiceKnownType(typeof(System.Reflection.Assembly))]
public class RegisterIndiNT : IContrato
{
    Boolean GetChecksum( Object o, out String debugging )
    {
        // code to cast Object to Assembly and to compute the checksum.
    }
}
Uri uri = new Uri(@"http://mywebserver.com/RegisterIndiNT.svc");
WCFOnlyContract.IContrato proxy = ChannelFactory<WCFOnlyContract.IContrato>.CreateChannel(
                new BasicHttpBinding(), new EndpointAddress(uri));

(proxy as ICommunicationObject).Open();

String debugging = String.Empty;
result = proxy.GetChecksum( Assembly.GetExecutingAssembly(), out debugging);

(proxy as ICommunicationObject).Close();
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
  if (info==null)
    throw new ArgumentNullException("info");

  Contract.EndContractBlock();

  UnitySerializationHolder.GetUnitySerializationInfo(info,   UnitySerializationHolder.AssemblyUnity, 
  this.FullName, 
  this);
}

internal static void GetUnitySerializationInfo(
            SerializationInfo info, int unityType, String data, RuntimeAssembly assembly)
{
  info.SetType(typeof(UnitySerializationHolder));
  info.AddValue("Data", data, typeof(String));
  info.AddValue("UnityType", unityType);

  String assemName;

  if (assembly == null) 
     assemName = String.Empty;
  else 
     assemName = assembly.FullName;

  info.AddValue("AssemblyName", assemName);
}
因此,只有程序集的名称被序列化,而不是代码等


谢谢@Servé。那么这个问题看起来还没有解决。(强名称程序集不是选项,因为项目中有其他未签名的第三方程序集)。