2011-10-26 112 views
2

在客户端我需要调用这个方法:为什么OperationContext.Current为空?

<OperationContract()> <WebMethod()> _ 
Public Function NotifierSignIn(ByRef url As String, ByVal login As String, ByVal password As String, ByVal sessionGuid As String, ByVal customerGuid As String) As String 
    Dim ret = String.Empty 
    Return ret 
End Function 

我试图把它叫为:

//sessionGuid is empty 
string url = string.Empty; 
string result = ws.NotifierSignIn(ref url, txtLogin.Text, txtPassword.Password, sessionGuid, txtCustomerGuid.Text); 

首先被执行的是在WCF服务(.NET 3.5)方法:

Public Sub New() 
    System.Net.ServicePointManager.ServerCertificateValidationCallback = _ 
     New System.Net.Security.RemoteCertificateValidationCallback(AddressOf CertificateValidationCallBack) 
    _errMsgs = ErrorMessages.GetInstance() 

    _authHandlerId = SoapHeaderHelper(Of Integer).GetInputHeader("HandlerId") 

End Sub 

我得到错误的

public object GetInputHeader(string name) 
{ 
    return GetHeader(name, OperationContext.Current.IncomingMessageHeaders); 
} 

,因为OperationContext.Current为空。

我的服务是WCF服务,因为我用户

<%@ServiceHost Language="VB" Service="MyWS.Service1" %> 

有趣的是我没有在小提琴手。

我该如何解决?

编辑 继Marc的建议(谢谢马克)我已经将字段的初始化移动到了propety。 但还是有问题。它进入到我的webmethod中,但在其中有下一个异常,因为OperationContext.Current仍然为空。 要明确: 在我的webmethod的第一行,我有: 昏暗的情况下= OperationContext.Current ,不幸的是它为空:/

所以,必须有另一个因素。

这是我在客户端的app.config:

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <section name="MyITNotifier.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/> 
    </sectionGroup> 
    </configSections> 

    <connectionStrings /> 

    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="Service1Soap" closeTimeout="00:01:00" openTimeout="00:01:00" 
      receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
      bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 

    <client> 
     <endpoint address="http://localhost:50002/MyIT.asmx" binding="basicHttpBinding" 
     bindingConfiguration="Service1Soap" contract="ServiceReference1.Service1Soap" 
     name="Service1Soap1" /> 
    </client> 

    </system.serviceModel> 

    <userSettings> 
    <MyITNotifier.Properties.Settings> 
     <setting name="UseAnimation" serializeAs="String"> 
     <value>False</value> 
     </setting> 
     <setting name="SoundFilePath" serializeAs="String"> 
     <value/> 
     </setting> 
     <setting name="UseCustomSound" serializeAs="String"> 
     <value>False</value> 
     </setting> 
     <setting name="PlaySound" serializeAs="String"> 
     <value>False</value> 
     </setting> 
     <setting name="HandlerId" serializeAs="String"> 
     <value>1</value> 
     </setting> 
     <setting name="SessionGuid" serializeAs="String"> 
     <value/> 
     </setting> 
     <setting name="MyItUrl" serializeAs="String"> 
     <value/> 
     </setting> 
     <setting name="Interval" serializeAs="String"> 
     <value>2</value> 
     </setting> 
     <setting name="RememberUser" serializeAs="String"> 
     <value>False</value> 
     </setting> 
     <setting name="CustomerGuid" serializeAs="String"> 
     <value/> 
     </setting> 
    </MyITNotifier.Properties.Settings> 
    </userSettings> 
<startup><supportedRuntime version="v2.0.50727"/></startup> 
</configuration> 
+1

如果您删除构造函数,将代码移动到某个方法,并从'NotifierSignIn'调用该方法 - 您仍会收到此错误吗?我认为'OperationContext'在构造函数中不存在,请尝试在方法中使用它。 – vorrtex

+0

删除我的答案(关于您的编辑) - 我很抱歉没有成功,但这似乎是一个合理的尝试。这是......好奇。 –

+0

@Marc因为你我学到了新东西,所以再次感谢:) – user278618

回答

1

在端点地址被列为http://localhost:50002/MyIT.asmx客户端配置。 ASMX服务不是WCF服务,所以如果您尝试在ASMX服务(在您的操作中声明WebMethod())中运行时访问任何WCF服务属性,则它们将为空。尝试通过将工具(svcutil/Add Service Reference)指向.svc文件而不是.asmx文件来重新生成客户端。

+0

你有权利。在每个项目中都是svc。只在这是asmx。这不是我的代码,但是我的愚蠢。谢谢 :) – user278618