【问题标题】:Connecting to WCF service from Azure Functions and trouble-shooting assembly bindings从 Azure Functions 连接到 WCF 服务并解决程序集绑定问题
【发布时间】:2016-11-17 10:46:07
【问题描述】:

在哪里可以看到 Azure 函数尝试加载的程序集? (就像 windows 上的 fuslogvw)

更新 根据要求更新标题以更好地反映接受的答案

更新

将我的代码更改为“手动”使用 WebClient 构造 SOAP 请求并且它可以工作......所以我认为 WCF 服务代理在 Azure Functions 的沙箱中表现不佳......不过我仍然想要一个回答我们如何查看程序集绑定日志视图。

原帖

我不断收到同样的错误:

2016-11-17T10:32:44.392 System.IO.FileNotFoundException:文件名, 目录名或卷标语法不正确。 (例外来自 HRESULT: 0x8007007B)

服务器堆栈跟踪:

在 System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)

在 Microsoft.Win32.Fusion.ReadCache(ArrayList alAssems, String 名称,UInt32 nFlag)

在 System.Reflection.RuntimeAssembly.EnumerateCache(AssemblyName 部分名称)

在 System.Reflection.RuntimeAssembly.LoadWithPartialNameInternal(AssemblyName an、证据securityEvidence、StackCrawlMark&stackMark)

在 System.Reflection.Assembly.LoadWithPartialName(String partialName, 证据 securityEvidence)

在 System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(类型 type, String defaultNamespace, XmlSerializerImplementation&contract)

在 System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] 映射,类型类型)

在 System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.SerializerGenerationContext.GenerateSerializers()

在 System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.SerializerGenerationContext.GetSerializer(Int32 句柄)

在 System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.MessageInfo.get_BodySerializer()

在 System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.SerializeBody(XmlDictionaryWriter writer,MessageVersion 版本,字符串操作,MessageDescription messageDescription, Object returnValue, Object[] 参数, Boolean 是请求)

在 System.ServiceModel.Dispatcher.OperationFormatter.SerializeBodyContents(XmlDictionaryWriter writer,MessageVersion 版本,Object[] 参数,Object returnValue, Boolean isRequest)

在 System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents(XmlDictionaryWriter 作家)

在 System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents(XmlDictionaryWriter 作家)

在 System.ServiceModel.Channels.Message.OnWriteMessage(XmlDictionaryWriter 作家)

在 System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.WriteMessage(消息 消息,流流)

在 System.ServiceModel.Channels.HttpOutput.WriteStreamedMessage(时间跨度 超时)

在 System.ServiceModel.Channels.HttpOutput.Send(TimeSpan 超时)

在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest(消息 消息,TimeSpan 超时)

在 System.ServiceModel.Channels.RequestChannel.Request(消息 消息,TimeSpan 超时)

在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息 消息,TimeSpan 超时)

在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, Object[] 出局,TimeSpan 超时)

在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime 操作)

在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 留言)

在 [0] 处重新抛出异常:

在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)

在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData,Int32 类型)

【问题讨论】:

  • 完全相同的代码在我的控制台应用程序中完美运行...有没有人在 azure 函数中使用 WCF 客户端代理的经验?

标签: azure azure-functions


【解决方案1】:

目前不支持查看程序集绑定日志。 Enabling diagnostic logs 将帮助调试大部分错误。也可以看看logging tips and tricks

以下是从您的函数连接到托管在 Azure 中的 WCF 服务的示例:

  1. 进入功能应用设置 --> 进入 Kudu --> 进入 D:\home\site\wwwroot\YourFunction
  2. 创建文件夹bin
  3. 上传 System.ServiceModel.dll
  4. 上传 WCF 服务合同 IService1.csx。您可以从 Kudu 或门户上的查看文件中执行此操作

     #r "System.ServiceModel.dll"
    
     using System.ServiceModel;
    
     [ServiceContract]
     public interface IService1
     {
         [OperationContract]
         string GetData(int value);
    
         [OperationContract]
         string WelComeMessage(String name);
     }
    
  5. 调用 WCF 端点的示例队列触发器:

    #r "System.ServiceModel.dll"
    #load "IService1.csx"
    
    using System;
    using System.ServiceModel;
    
    public static void Run(string myQueueItem, TraceWriter log)
    {
        log.Info($"C# Queue trigger function processed: {myQueueItem}");
    
        BasicHttpBinding b = new BasicHttpBinding();
        EndpointAddress ea = new  EndpointAddress("http://YourServiceAddress/service1.svc?wsdl");
        var myChannelFactory = new ChannelFactory<IService1>(b, ea);
        IService1 client = myChannelFactory.CreateChannel();
        var msg= client.WelComeMessage("HelloWorld");
        ((ICommunicationObject)client).Close();
        log.Info($"Hello from WCF: {msg}");
     }
    

希望这会有所帮助!

【讨论】:

  • 哇,谢谢您的解释,我现在要尝试一下......我们应该部署服务模型程序集是有道理的 - 尽管我本以为 #r 会小心的它以某种方式(GAC 或其他方式)......我认为这会起作用,我会告诉你,我会将你的答案标记为正确的答案 - 因为我正在寻找查看程序集绑定日志的方法 - 而你确实回答了,额外的好处是 WCF 的东西。谢谢并尽快通知您。
  • 除了here列出的程序集之外,您需要将您需要的dll上传到bin文件夹中
  • 您能否将标题更新为:从函数连接到 WCF 服务以获得更好的可发现性?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2010-12-18
相关资源
最近更新 更多