2016-12-03 3 views
0

Ich spiele mit Microsoft Azure herum, um Nachrichten über ein Thema an ein Abonnement in der Cloud zu senden. Aber es gab Probleme mit Microsofts Python SDK, speziell ein ValueError beim Deserialisieren einer Nachricht aus der Cloud.azure.servicebus Meldung ValueError in Python

Dies ist mein Code

bus_service = ServiceBusService(
    service_namespace='"<namegoeshere>"', 
    shared_access_key_name='"<nameofkeygoeshere>"', 
    shared_access_key_value='"<keyvaluegoeshere>"') 

bus_service.create_topic('topic') 
bus_service.create_subscription('topic', 'AllMessages') 
msg = Message("HelloWorld") 
bus_service.send_topic_message('topic', msg) 

// at this point I can see the message arrive in my Azure portal 

// then it crashes when I try to retrieve the message I just sent 
msg = bus_service.receive_subscription_message('topic', 'AllMessages', peek_lock=False) 
print(msg.body) 

Dies ist der Fehler:

Traceback (most recent call last): 
    File "C:/Users/user/PycharmProjects/test/helloworld.py", line 59, in <module> 
msg = bus_service.receive_subscription_message('topic', 'AllMessages', peek_lock=False) 
    File "D:\Program Files\Anaconda2\lib\site-packages\azure\servicebus\servicebusservice.py", line 976, in receive_subscription_message 
timeout) 
    File "D:\Program Files\Anaconda2\lib\site-packages\azure\servicebus\servicebusservice.py", line 764, in read_delete_subscription_message 
return _create_message(response, self) 
    File "D:\Program Files\Anaconda2\lib\site-packages\azure\servicebus\_serialization.py", line 101, in _create_message 
elif str(int(float(value))) == value: 
ValueError: could not convert string to float: max-age=31536000 

Process finished with exit code 1 

ich in die Klasse ging und hatte einen Blick:

def _create_message(response, service_instance): 
    ''' Create message from response. 

    response: 
     response from service bus cloud server. 
    service_instance: 
     the service bus client. 
''' 
respbody = response.body 
custom_properties = {} 
broker_properties = None 
message_type = None 
message_location = None 

# gets all information from respheaders. 
for name, value in response.headers: 
    if name.lower() == 'brokerproperties': 
     broker_properties = json.loads(value) 
    elif name.lower() == 'content-type': 
     message_type = value 
    elif name.lower() == 'location': 
     message_location = value 
    elif name.lower() not in ['content-type', 
           'brokerproperties', 
           'transfer-encoding', 
           'server', 
           'location', 
           'date']: 

     if '"' in value: 
      value = value[1:-1] 
      try: 
       custom_properties[name] = datetime.strptime(
        value, '%a, %d %b %Y %H:%M:%S GMT') 
      except ValueError: 
       custom_properties[name] = value 
     else: # only int, float or boolean 
      if value.lower() == 'true': 
       custom_properties[name] = True 
      elif value.lower() == 'false': 
       custom_properties[name] = False 
      # int('3.1') doesn't work so need to get float('3.14') first 
      elif str(int(float(value))) == value: # <---- Exception ! 
       custom_properties[name] = int(value) 
      else: 
       custom_properties[name] = float(value) 

Alle Ideen, was ich tun konnte, um das zu lösen?

Antwort

0

Ich musste Microsofts _serialization.py Datei ändern, um es zum Funktionieren zu bringen. Umwickeln der säumige Block in einem Try/außer Block:

if '"' in value: 
    value = value[1:-1] 
    try: 
     custom_properties[name] = datetime.strptime(
      value, '%a, %d %b %Y %H:%M:%S GMT') 
    except ValueError: 
     custom_properties[name] = value 
else: # only int, float or boolean 
    try: 
     if value.lower() == 'true': 
      custom_properties[name] = True 
     elif value.lower() == 'false': 
      custom_properties[name] = False 
     # int('3.1') doesn't work so need to get float('3.14') first 
     elif str(int(float(value))) == value: 
      custom_properties[name] = int(value) 
     else: 
      custom_properties[name] = float(value) 
    except ValueError: 
     custom_properties[name] = value 

scheint so weit zu arbeiten ..

So, Microsoft ... Jede Chance auf einen Job ...

Verwandte Themen