0

部署到我们的预生产环境时,我遇到了 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 都很陌生。但是,我希望我已经提供了足够的信息,以便其他人可以看到这个问题。

任何帮助都感激不尽。

谢谢。

4

1 回答 1

0

答案是 global_asax.Application_PreRequestHandlerExecute 中存在问题(线索在翻转异常中-doh!)

该过程试图将处理程序转换为一个页面,这显然不是一个 ajax 请求。我只是在强制转换处理程序调用上放了一个 trycast,其余过程被绕过,允许请求返回结果。

于 2013-03-14T15:54:02.557 回答