我实现了两个aspnet核心webapi服务。第一个服务(.net核心)使用restsharp调用第二个服务(.net framework 461):
public static RestResponse Execute(this IRestClient client, IRestRequest request)
{
var taskCompletion = new TaskCompletionSource();
client.ExecuteAsync(request, r => taskCompletion.SetResult(r));
return (RestResponse)(taskCompletion.Task.Result);
}
请注意,该任务是故意同步调用的,因此代码中的.Result
。此方法也称为使用经过身份验证的用户进行模拟!
这两项服务都托管在IIS中,并配置为使用Kerberos Windows身份验证。两种服务都以管理员身份运行。只有第一个服务使用https而另一个服务仅使用http,但两者都使用与绑定URL相同的域。现在,当我在本地开发环境中调试两个服务时,一切正常。将代码移动到IIS我得到以下异常:
调用上述方法Execute
时发生错误。我检查了事件日志,如果Kerberos可能有问题但无法看到任何与Kerberos相关的问题。在我的日志文件中,我还可以看到第二个服务没有运行任何代码,调用没有那么远。
有人可以指出我正确的方向。我不知道可能导致这个问题的原因。
更新 我试图用服务器外部的Firefox调用这两种服务,但是在服务器重新启动后它再也没有工作了。非常奇怪的行为。
答案 0 :(得分:0)
我发现我们得到的例外是由于服务主要名称错误地分配给两个服务。这两种服务都在同一台机器上运行,这引起我们对两种服务使用相同的SPN,但使用不同的端口。这是一个坏主意(不要这样做!)并导致各种奇怪的异常,例如WebException" Access被拒绝"。
使用唯一的SPN分配每个服务解决了问题,异常消失了。