部署到我们的预生产环境时,我遇到了 WCF 问题。它在本地运行良好。我收到的 AJAX 消息是出现解析错误,但我无法在 preprod 服务器上获取任何跟踪日志记录,但同样,日志记录在我的本地(具有相同的 webconfig 设置)上工作正常。
Traces.svlog 将在 preprod 上记录任何内容的唯一时间是卸载应用程序域时。在我的本地,我可以抛出故意的异常,这将被记录在日志中。
如果我已登录,则无法导航到服务路径,而是引发异常(见下文)。但是,如果我没有登录,我可以访问服务页面并单击 wsdl,查看方法等。我知道登录后出了什么问题。
例外:
Process information:
Process ID: 4796
Process name: w3wp.exe
Account name: NT AUTHORITY\NETWORK SERVICE
Exception information:
Exception type: InvalidCastException
Exception message: Unable to cast object of type
System.ServiceModel.Activation.HttpHandler' to type 'System.Web.UI.Page'.
Request information:
Request URL: http://100.100.100.104/Application/Webservices/People.svc/GetAllActive
Request path: /Application/Webservices/People.svc/GetAllActive
User host address: 102.24.1.152
User:
Is authenticated: False
Authentication Type:
Thread account name: domainA\userB
Thread information:
Thread ID: 7
Thread account name: domainA\userB
Is impersonating: True
Stack trace: at ASP.global_asax.Application_PreRequestHandlerExecute
(Object sender, EventArgs e)
at
System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
我们在 preprod 环境中运行 IIS6。
起初,我注意到 IISManager -> AppplicationProperies->HomeDirectory->Configuration 中没有 svc 扩展。然后我手动添加了它。
在此之后,由于我在其他地方读到的内容,我还从正确的位置运行了以下两个命令:
aspnet_regiis -i
ServiceModelReg.exe -i
同样,他们没有采取任何措施来修复错误。
我的主要困惑是,只要我没有登录,我就可以输入 URL 并访问 svc wsdl。从上面的错误消息中可以看出,我们的 webconfig 正在使用模拟 - 不确定这是否有任何影响。
我的服务目录结构是这样的
Application
->AppCode
...->People.vb
->DirA
...->DirB
......->Calling.aspx
->WebServices
...->People.svc
我在 Calling.aspx 中的 ajax 调用如下所示:
jQuery_1_8_3(document).ready(function() {
jQuery_1_8_3.ajaxSetup({
data: "{}",
dataType: "json",
type: "POST",
contentType: "application/json",
converters: {
"json jsond": function(msg) {
return msg.hasOwnProperty('d') ? msg.d : msg;
}
}
});
jQuery_1_8_3.ajax({
url: "../../Webservices/People.svc/GetAllActive",
success: function(resdata) {
//etc
}
});
svc 如下所示:
我的 Vb 如下所示:
<ServiceContract(Namespace:="people")> _
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class People
<CLSCompliant(False)> _
<OperationContract()> _
<WebInvoke(BodyStyle:=WebMessageBodyStyle.Wrapped, RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json)> _
Public Function GetAllActive() As PersonDetailDataContract()
Dim service As New RepositoryService()
Dim personList As IList(Of Interfaces.ModelInterfaces.IPersonDetail)
personList = service.GetAllPersonDetails()
Dim contractList As New ArrayList()
For Each
//Populate contractlist, etc
Next
Dim array() As PersonDetailDataContract
array = contractList.Cast(Of PersonDetailDataContract)().ToArray()
Return array
End Function
End Class
正如你所看到的,我没有费心为合同创建一个单独的接口——我只是把它放在了具体的类上。
(我还匿名了代码和 IP 等)。
我的 Webconfig 如下所示(减去其他应用程序的大量其他内容。
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "C:\svclogs\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging
logMessagesAtTransportLevel="true"
logMessagesAtServiceLevel="true"
logMalformedMessages="true"
logEntireMessage="true"
maxSizeOfMessageToLog="65535000" maxMessagesToLog="500" />
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="PeopleTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="json">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="People" behaviorConfiguration="PeopleTypeBehaviors">
<endpoint address=""
behaviorConfiguration="json"
binding="webHttpBinding"
contract="People" />
<endpoint contract="IMetadataExchange"
binding="mexHttpBinding"
address="mex" />
</service>
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
我在这里变得有点难过,而且我对任何类型的 WebServices 都很陌生。但是,我希望我已经提供了足够的信息,以便其他人可以看到这个问题。
任何帮助都感激不尽。
谢谢。