Generyczna konwersja wartości string na value type

public static T? ToNullable<T>(this string s) where T : struct
{
     if (string.IsNullOrWhiteSpace(s))
     return null;

     TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
     return (T)conv.ConvertFrom(s);
}
Advertisements

Implementacja intefrejsu IClientMessageInspector

Implementacja intefrejsu IClientMessageInspector umożliwiającego odczytanie i modyfikację komunikatu soap otrzymanego z serwisu. Dodatkowo należy zaimplementować interfejs IEndpointBehavior, za pomocą którego definiujemy własny behavior oraz napisać swój BehaviorExtensionElement co daje nam możliwość wykorzystania behaviora bezpośrednio w pliku konfiguracyjnym.

 namespace ConsoleMyApp
 {
     public class MyBehavior : IEndpointBehavior
     {
         #region IEndpointBehavior Members

         public void AddBindingParameters(
             ServiceEndpoint endpoint,
             BindingParameterCollection bindingParameters)
         {
         }

         public void ApplyClientBehavior(
             ServiceEndpoint endpoint,
             ClientRuntime clientRuntime)
         {
             clientRuntime.MessageInspectors.Add(new MyMessageInspector());
         }

         public void ApplyDispatchBehavior(
             ServiceEndpoint endpoint,
             EndpointDispatcher endpointDispatcher)
         {
         }

         public void Validate(
             ServiceEndpoint endpoint)
         {
         }

         #endregion
     }

     public class MyMessageInspector : IClientMessageInspector
     {
         #region IClientMessageInspector Members

         public void AfterReceiveReply(
             ref Message reply,
             object correlationState)
         {
             Console.WriteLine(
             "Received the following reply: '{0}'", reply.ToString());           
         }

         public object BeforeSendRequest(
             ref Message request,
             IClientChannel channel)
         {
             Console.WriteLine(
             "Sending the following request: '{0}'", request.ToString());
             return null;
         }

         #endregion
     }

     public class CustomBehaviorExtensionElement : BehaviorExtensionElement
     {
         protected override object CreateBehavior()
         {
             return new MyBehavior();
         }

         public override Type BehaviorType
         {
             get
             {
                 return typeof(MyBehavior);
             }
         }
     }
 }

I przykładowy app.config

<?xml version="1.0" encoding="utf-8" ?>
 <configuration>
   <system.diagnostics>
     <sharedListeners>
       <add name="System.Net" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\logs\System.Net.trace.txt" traceOutputOptions="DateTime" />
     </sharedListeners>
     <sources>
       <source name="System.ServiceModel.MessageLogging">
         <listeners>
           <add name="messages"
           type="System.Diagnostics.XmlWriterTraceListener"
           initializeData="c:\logs\messagesCC.svclog" />
         </listeners>
       </source>
       <source name="System.ServiceModel" switchValue="All" propagateActivity="true">
         <listeners>
           <add name="messages"
           type="System.Diagnostics.XmlWriterTraceListener"
           initializeData="c:\logs\diagnosticsCC.svclog" />
         </listeners>
       </source>
       <source name="System.Net" switchValue="All">
         <listeners>
           <add name="System.Net"/>
         </listeners>
       </source>
       <source name="System.Net.HttpListener" switchValue="All">
         <listeners>
           <add name="System.Net"/>
         </listeners>
       </source>
       <source name="System.Net.Sockets" switchValue="All">
         <listeners>
           <add name="System.Net"/>
         </listeners>
       </source>
       <source name="System.Net.Cache" switchValue="All">
         <listeners>
           <add name="System.Net"/>
         </listeners>
       </source>
     </sources>
   </system.diagnostics>
   <system.serviceModel>
     <bindings>
       <basicHttpBinding>
         <binding name="PhBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
           receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
           bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
           maxBufferSize="524288" maxBufferPoolSize="524288" maxReceivedMessageSize="524288"
           messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
           useDefaultWebProxy="true">
           <readerQuotas maxDepth="32" maxStringContentLength="5242880"
             maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
           <security mode="None">
             <transport clientCredentialType="None" proxyCredentialType="None"
               realm="" />
             <message clientCredentialType="UserName" algorithmSuite="Default" />
           </security>
         </binding>        
       </basicHttpBinding>
       <wsHttpBinding>
         <binding name="customWsHttpBinding">
           <security mode="None" />
         </binding>
       </wsHttpBinding>
     </bindings>
     <client>
       <endpoint address="ADDRESS_SERVISU" behaviorConfiguration="Behavior"
         binding="basicHttpBinding" bindingConfiguration="PhBinding"
         contract="MyService.PhPortType" name="PhPort" />
     </client>
     <extensions>
       <behaviorExtensions>
         <add name="BehaviorElement"
           type="ConsoleMyApp.CustomBehaviorExtensionElement, ConsoleMyApp"/>
       </behaviorExtensions>
     </extensions>
     <behaviors>
       <endpointBehaviors>
         <behavior name="Behavior">
           <BehaviorElement />
         </behavior>
       </endpointBehaviors>
     </behaviors>
     <diagnostics>
       <messageLogging
            logEntireMessage="true"
            logMalformedMessages="false"
            logMessagesAtServiceLevel="true"
            logMessagesAtTransportLevel="false"
            maxMessagesToLog="3000"
            maxSizeOfMessageToLog="2000"/>
     </diagnostics>
   </system.serviceModel>
 </configuration>

Could not load type ‘System.ServiceModel.Activation.HttpModule’

Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
Description: An unhandled exception occurred during the execution of the current Web request. Review the stack trace for more information about the error and where it originated in the code.
 Exception Details: System.TypeLoadException: Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

Taki błąd pojawia się jeśli instalujemy IIS i .NET Framework w odwróconej kolejności, a mianowicie wtedy, kiedy IIS jest instalowany po zainstalowaniu .NET Framework, albo jeśli WCF Http Activation moduł jest instalowany po zainstalowaniu IIS i .NET Framework.
Problem ten można rozwiązać za pomocą ASP.NET IIS Registration Tool (aspnet_regiis.exe) .
Należy uruchomić to polecenie z parametrami -iru:

aspnet_regiis.exe -iru

Dodatkowo przydatne może okazać się również poniższe polecenie:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319>ServiceModelReg.exe -r

Menu MFG w WP7

Kod dający dostęp do menu MFG w telefonie LG E900 z sytemem Windows Phone 7: ##634#. Hasło to: 277634#*#.
W menu tym można m.in. ustawić profil dostawcy sieci telefonicznej. W ten sposób dodałem sieć T-Mobile i dzięki temu mogę pobierać zdjęcia z MMS-ów. Dla T-Mobile należy podać MCC=260 i MNC=02 w podmenu Other settings/Set network profile. Zostanie znaleziony odpowiedni plik xml z ustawieniami.