2011-03-04 50 views
7

我使用Mathematica .Net/Link platform来创建Web服务来格式化和计算数学问题。然而,我无法得到它的工作。Asp.Net应用程序中的Mathematica .Net/Link

我创建使用此代码是:

_Log.IpDebug("Starting the Kernel Link"); 
if (string.IsNullOrEmpty(_MathLinkArguments)) 
    _InternelKernel = MathLinkFactory.CreateKernelLink(); 
else 
    _InternelKernel = MathLinkFactory.CreateKernelLink(_MathLinkArguments); 
_Log.IpDebug("Kernel Link Started"); 
_InternelKernel.WaitAndDiscardAnswer(); 

_MathLinkArguments值是-linkmode launch -linkname \"C:\\Program Files\\Wolfram Research\\Mathematica\\7.0\\Math.exe\"

这段代码是从global.asax.cs文件的Application_Start方法中调用的。

当它到达WaitAndDiscardAnswer()调用它给服务器错误:

Error code: 11. Connected MathLink program has closed the link, but there might still be data underway. 

注:与.NET /链路包(包括一个控制台应用程序和WinForms应用程序)给出的SampleCode工作。

编辑: 我复制使用Mathematica给出的控制台应用程序示例代码到一个asp.net页面,它给了我同样的错误第一负载,然后在后续加载它给了我:

Error code: 1. MathLink connection was lost. 

EDIT2 : 我忘了提及,当我运行我的应用程序时打开procmon和任务管理器,我可以判断出Math.exe已经启动,但它立即退出,这使得这些错误代码变得完整无缺......但并不能解释为什么那事发生了。

+0

如果没有指定_MathLinkArguments作品是不是从你的问题不清楚。你检查过_InternelKernel变量是否为空?我相信你知道linkname只是一个字符串,并不一定非常复杂。唯一的标识符是确定的。以下在你的Mathematica内核中运行kernel = LinkLaunch [ “C:\\ Program Files \\ Wolfram \ Research \\ Mathematica \\ 7.0 \\ MathKernel.exe”<> “-linkmode launch -linkname uniqueIdentifier123”] ;打印[ LinkRead [kernel]]; LinkClose [kernel]' – Sasha 2011-03-04 21:39:42

+0

它无法使用_MathLinkArguments,但错误是它只是挂起并且从不加载页面。另外,当我在Mathematica中运行这段代码时,我得到'InputNamePacket [In [1]:=]' – 2011-03-04 21:45:24

+0

您是否尝试创建一个与发布的代码等效的独立CS程序?它工作吗? – Sasha 2011-03-04 22:01:07

回答

2

要允许.Net/Link在Asp.net中工作(至少在IIS 7.5中),您需要在网站的应用程序池上启用属性loadUserProfile

我不完全确定为什么会出现这种情况,但从我在尝试调试时发现的情况来看,有些事情是从用户的配置文件中获取的。我知道内核的默认位置是这个事实,这就解释了为什么我不能在没有参数的情况下使用它,所以我只能假定还需要其他东西,如果没有配置文件,它不能确定。

但无论什么原因,这是必需的,它是,或者至少这是一个修复,如果你在你自己的应用程序中得到类似的问题。

1

我在.Net WinForm应用程序中遇到了同样的错误。

mathKernel = new MathKernel(); 
mathKernel.Compute("<< XYZ`XYZGraphs`"); 

在实例化MathKernel之后直接加载包时发生错误。

要解决它,你可以等几秒钟,然后实例化MathKernel工作正常。在此状态下,可能仍有数据进行下列条件都假的:

if (!MathKernel.IsConnected) 
{ 
    MathKernel.Connect(); 
} 

if (MathKernel.IsComputing) 
{ 
    MathKernel.Abort(); 
} 

编辑:

我又收到错误,这个时候能确定问题。

使用命令行打开MathKernel。exe文件,并查看错误信息:

enter image description here