【问题标题】:Not able to load the third party dll in IIS hosted rest WCF service无法在 IIS 托管的 REST WCF 服务中加载第三方 dll
【发布时间】:2013-01-06 17:56:47
【问题描述】:

我已将Rest WCF 托管到我的IIS 7。我测试了所有内容,除了导入dll 外,它工作正常。我的实例类代码如下:

[OperationContract, WebInvoke(Method = "GET", UriTemplate = "/getname?name={name}&age={age}", ResponseFormat = WebMessageFormat.Json)]
    bool getname(string name, string age);

[OperationContract, WebInvoke(Method = "GET", UriTemplate = "/getcallfromdll?name={name}&age={age}", ResponseFormat = WebMessageFormat.Json)]
    bool getcallfromdll(string name, string age);

而上述方法的定义是:

public string getname(string name, int len)
    {
        return "It's working";
    }
public string getcallfromdll(string name, int len)
    {
        return UnsafeNativeMethods.getvalue(name, len); //Unsafe.. is a internal structure
    }

internal static class UnsafeNativeMethods
    {
        const string _dllLocation = "school.dll";

        [DllImport(_dllLocation, CallingConvention = CallingConvention.Cdecl)]
        public static extern bool getvalue(string name, String len);
     }

当尝试运行localhost:8085/service.svc/getname?name=kajn&len=21:它返回"It's working",这是正确的,但每当我尝试调用localhost:8085/service.svc/getcallfromdll?name=kajn&len=21:它返回The server encountered an error processing the request. See server logs for more details.

我搜索了它,不知何故我知道这一切都是由于服务而发生的,找不到DLL。为了解决这个问题,我尝试将我的 dll 放在以下位置,但它没有帮助我:( :

  • system32/inetsrv
  • SysWOW64/inetsrv
  • 在 bin 文件夹中
  • 我还将项目所在的文件夹放在同一个文件夹中。

但是对我没有任何作用。请建议我一个解决方案。

注意:dll 没有问题,因为我从自托管的 WCF 应用程序调用 dll 方法并且它运行良好。当时我把我的dll放到bin/debug文件夹中。

【问题讨论】:

    标签: c# wcf dll dllimport


    【解决方案1】:

    我猜这可能与 IIS 可能将二进制文件复制到影子位置这一事实有关,而当它这样做时,它可能没有意识到可能需要非托管 dll。您的“school.dll”是您的 WCF 解决方案的一部分吗?它是作为参考添加的吗?它还依赖于任何其他非托管 dll 吗?下次遇到该错误时,您可以尝试搜索系统以查找 WCF dll 的所有实例,然后如果您在影子位置找到一个,请查看您的“school.dll”是否也在那里。

    【讨论】:

    • 不,我不能添加school.dll 作为参考,因为它是我自己创建的native dll。不,它不依赖于另一个 dll。我无法理解你。如果您不介意,请再解释一下
    • 是的,抱歉,我说的不是很准确。我通常将非托管 dll 作为普通项目添加到项目文件中,并在“始终复制”的“复制到输出目录”值下指定。其他一些建议 - 如果您有 32 位 dll,请在应用程序池下的 IIS 中尝试将“启用 32ibt 应用程序”设置为 true。您也可以尝试在调试器中运行您的应用程序,这样您就可以看到您收到的确切错误消息。
    • P.S.我实际上启动了一个 VS 并创建了与您的非常相似的场景,所以我很肯定这是可能的 :)
    • 谢谢@sebastian。你在stackoverflow上帮了我两次:)
    【解决方案2】:

    好吧,您应该在服务器上打开 WCF 跟踪,看看实际的错误/异常是什么。但我会怀疑某种与权限相关的错误......即可以找到 DLL,但 IIS 工作进程没有正确的权限来读取它或执行其中的方法。仅出于调试目的,请尝试设置 DLL 的权限,使其可以被“所有人”读取/执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多