2011-10-26 107 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