Hallo zusammen,
habe einen Webservice, welcher Rechner anpingt, MAC Adressen anhand von IP Adressen ermittelt und Rechner mittels WOL aufweckt.
Drei Web Methoden in einem Webservice.
Der Webservice funktioniert per Debugger sowie per Aufruf über meinen lokalen IIS. Alle Methoden klappen ebenfalls.
Nun habe ich den Webservice in mein Projekt eingebunden und versuche meine Rechner anzupingen. Klappt wunderbar und alles funktioniert.
Nun mache ich das gleiche mit der MAC Adresse. Ich erstelle einen EventHandler und eine entsprechende Methode. Rufe alles genauso auf, wie beim Pingen. Nur erhalte ich einen Fehler (Anhang).
Woran könnte das liegen? Bin echt ratlos 😦 Das eine klappt, das Andere nicht.
WakeOnLAN.pingRequest.Service1SoapClient myPing = new WakeOnLAN.pingRequest.Service1SoapClient();
myPing.GetMACAddressCompleted += myPing_myMACAddressEvent;
myPing.GetMACAddressAsync(ipAddress);
public void myPing_myMACAddressEvent(Object objSender, WakeOnLAN.pingRequest.GetMACAddressCompletedEventArgs e)
{
string macAddress = e.Result;
}
Mein Webservice:
[DllImport("iphlpapi.dll", ExactSpelling = true)]
static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
[WebMethod]
public string GetMACAddress(string hostNameOrAddress)
{
IPHostEntry hostEntry = Dns.GetHostEntry(hostNameOrAddress);
if (hostEntry.AddressList.Length == 0)
return null;
byte[] macAddr = new byte[6];
uint macAddrLen = (uint)macAddr.Length;
if (SendARP((int)hostEntry.AddressList[0].Address, 0, macAddr, ref macAddrLen) != 0)
return null;
StringBuilder macAddressString = new StringBuilder();
for (int i = 0; i < macAddr.Length; i++)
{
if (macAddressString.Length > 0)
macAddressString.Append(":");
macAddressString.AppendFormat("{0:x2}", macAddr[i]);
}
return macAddressString.ToString();
}
//edit: Bitte nicht wundern, dass mein Webservice "pingRequest" heisst. Ursprünglich war dieser nur für das pingen zuständig und ich hatte andere Webservices für Mac Adresse / WOL aber diese hab ich nun zusammengefügt.
Der Fehler bleibt übrigens auch, wenn ich die Webservices splitte in mehrere Dateien.
Fehlermeldungen bitte direkt in den Text und zwar mit den [[nop][/nop]error]-Tags. Das erleichtert den Helfenden die Arbeit und kommt dir zu Gute.
Mit freundlichen Grüßen,
InSiDeR
Interessant wäre ja was nicht gefunden wird.
Schreib doch mal ein Try-Catch um den Inhalt deiner Methode GetMACAddress und protokolliere mal den Fehler, oder gib ihn als out parameter an den Client zurück.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Verarbeitet dein Netzwerk WOL überhaupt korrekt?
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
Interessant wäre ja was nicht gefunden wird.
Schreib doch mal ein Try-Catch um den Inhalt deiner Methode GetMACAddress und protokolliere mal den Fehler, oder gib ihn als out parameter an den Client zurück.
In der Reference.cs, welche von Visual Studio erzeugt wird?
public WakeOnLAN.pingRequest.GetMACAddressResponse EndGetMACAddress(System.IAsyncResult result) {
object[] _args = new object[0];
WakeOnLAN.pingRequest.GetMACAddressResponse _result;
try
{
_result = ((WakeOnLAN.pingRequest.GetMACAddressResponse)(base.EndInvoke("GetMACAddress", _args, result)));
}
catch (System.Exception)
{
throw;
}
return _result;
}
Was raus kommt:
Der selbe Fehler beim throw
Verarbeitet dein Netzwerk WOL überhaupt korrekt?
Das ist ja erstmal völlig egal. Ich möchte ja erstmal nur die MAC Adresse ermitteln und ausgeben. Dafür ist kein WOL vonnöten. Erst wenn das klappt, versuch ich die MAC Adresse der WebMethod "WakeonLan" mit zu geben.
Mit freundlichen Grüßen,
InSiDeR
Interessant wäre ja was nicht gefunden wird.
Schreib doch mal ein Try-Catch um den Inhalt deiner Methode GetMACAddress und protokolliere mal den Fehler, oder gib ihn als out parameter an den Client zurück.
In der Reference.cs, welche von Visual Studio erzeugt wird?
Nein, in der Webservice Methode. Der liefert ja höchstwahrscheinlich den Fehler.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Wenn ich nur den Webservice im lokalen IIS bzw. Debugger in Visual Studio aufrufe, funktioniert dieser einwandfrei ohne Fehlermeldungen.
Einzig bei
if (SendARP((int)hostEntry.AddressList[0].Address, 0, macAddr, ref macAddrLen) != 0)
wird folgende Warnung erzeugt
Fehlermeldung:
Warnung 1 "System.Net.IPAddress.Address" ist veraltet: ""This property has been deprecated. It is address family dependent. Please use IPAddress.Equals method to perform comparisons.
> "" C:\Abschlussprojekt\PingRequest\PingRequest\PingRequest.asmx.cs 35 30 PingRequest
Das ist aber nicht tragisch.
Sooo...
[DllImport("iphlpapi.dll", ExactSpelling = true)]
static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
[WebMethod]
public string GetMACAddress(string hostNameOrAddress)
{
try
{
IPHostEntry hostEntry = Dns.GetHostEntry(hostNameOrAddress);
if (hostEntry.AddressList.Length == 0)
return null;
byte[] macAddr = new byte[6];
uint macAddrLen = (uint)macAddr.Length;
if (SendARP((int)hostEntry.AddressList[0].Address, 0, macAddr, ref macAddrLen) != 0)
return null;
StringBuilder macAddressString = new StringBuilder();
for (int i = 0; i < macAddr.Length; i++)
{
if (macAddressString.Length > 0)
macAddressString.Append(":");
macAddressString.AppendFormat("{0:x2}", macAddr[i]);
}
return macAddressString.ToString();
}
catch (Exception)
{
throw;
}
}
Hab alles aktualisiert. Es kommt der gleiche Fehler raus am gleichen Punkt. Im Webservice springt er nicht in den catch Block.
//edit:
Zum Vergleich::
pingRequest Methode (funktioniert)
public WakeOnLAN.pingRequest.pingRequestResponse EndpingRequest(System.IAsyncResult result) {
object[] _args = new object[0];
WakeOnLAN.pingRequest.pingRequestResponse _result = ((WakeOnLAN.pingRequest.pingRequestResponse)(base.EndInvoke("pingRequest", _args, result)));
return _result;
}
GetMACAddress Methode (funktioniert nicht)
public WakeOnLAN.pingRequest.GetMACAddressResponse EndGetMACAddress(System.IAsyncResult result) {
object[] _args = new object[0];
WakeOnLAN.pingRequest.GetMACAddressResponse _result = ((WakeOnLAN.pingRequest.GetMACAddressResponse)(base.EndInvoke("GetMACAddress", _args, result)));
return _result;
}
Wenn ich mit dem Debugger durchgehe, erhält die MAC Adresse immer "null"
//edit2:
Habe nun mal weiter probiert. Schon sehr kurios. Manchmal klappt es, manchmal nicht.
1.) Ist der Rechner eingeschaltet, erhalte ich manchmal die MAC und manchmal nur null. Bei meinem eigenen Rechner, welcher eingeschaltet ist, erhalte ich den NotFound Fehler.
2.) Ist der Rechner ausgeschaltet, erhalte ich die NotFound Fehlermeldung oder null.
3.) Ist die IP/Namensauflösung nicht korrekt erhalte ich die NotFound Fehlermeldung.
Woran kann das liegen, dass es manchmal klappt und manchmal nicht? Die IP Adresse steht ja in der Liste, egal ob der Rechner ein- oder ausgeschaltet ist. Schon sehr kurios...
Mit freundlichen Grüßen,
InSiDeR
Unabhängig von deinen Ergebnissen, du sollst die Exception nicht weiter werfen! - Du sollst sie entweder loggen oder aber als Outparameter zurück geben.
[WebMethod]
public string MyMethod(string myInput, out string error)
{
string myResult = string.Empty;
error = string.Empty;
try
{
// the whole method
}
catch(Exception ex)
{
error = ex.ToString();
}
return myResult;
}
Ganz allgemein lässt sich doch aus deinen Ergebnissen raus lesen, dass du nur Mac-Adressen für Rechner bekommst die eingeschaltet und erreichbar sind.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Genau das ist es, was passiert.
Benötige aber die MAC Adressen auch von ausgeschalteten Rechnern. Macht ja sonst keinen Sinn, da ich die ausgeschalteten PC's starten möchte.
Mit freundlichen Grüßen,
InSiDeR
Benötige aber die MAC Adressen auch von ausgeschalteten Rechnern.
Ja, dann musst Du sie eben besorgen und speichern, wenn der Rechner an ist. Der Rechner muss einmal bekannt gemacht werden - wie soll es anders gehen?
Dann muss ich das wohl notfalls so lösen und einfach zusätzlich die MAC Adresse in die XML Datei speichern und darüber das Magic Paket absenden. Spare ich mir einen Webservice zum ermitteln der MAC. Das probiere ich einfach mal aus 😃
Mit freundlichen Grüßen,
InSiDeR