无法在IIS托管的其他WCF服务中加载第三方dll

时间:2013-01-06 17:56:48

标签: c# wcf dll dllimport

我已向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文件夹。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

相关问题